XCConfig синтаксис
Если бы у меня был Adhoc.xcconfig
где я определил переменную:
PREPROCESSOR_DEFINITIONS = IS_ADHOC=1 CRASHLYTICS=1
и в скрипте запуска есть проверка, которая выглядит следующим образом:
if [ "${PREPROCESSOR_DEFINTIONS/CRASHLYTICS=1}" = "$PREPROCESSOR_DEFINITIONS" ] ; then
echo "Crashlytics is disabled, skipping Crashlytics dSYM upload"
else
echo "Crashlytics is on"
end
Что это, если заявление проверить? Мне неясно, если /
это синтаксис, специфичный для bash или xcconfig. Что также сбивает с толку, так это то, что оператор if проверяет результат присваивания с помощью =
не ==
,
Разбиваем оператор if по частям:
"${PREPROCESSOR_DEFINITIONS}/CRASHLYTICS=1}"
- это расширение переменной./
- это индексирование большей переменной,PREPROCESSOR_DEFINTIONS
проверить на наличиеCRASHLYTICS
переменная?= "$PREPROCESSOR_DEFINITIONS"
- это просто присвоение этого строкового литерала результату предыдущего выражения?
Любой, кто мог бы осветить этот синтаксис и что пытается выполнить оператор if, это было бы здорово.
1 ответ
Это все о bash
, а не файлы xcconfig. xcconfig
файл только устанавливает настройку сборки. По умолчанию параметры сборки экспортируются в фазы сборки сценариев выполнения как переменные среды. Это единственные отношения между ними. Формат файлов xcconfig был актуален только при чтении файла xcconfig.
От bash
Раздел справочной страницы по расширению параметров:
$ {Параметр / шаблон / строка}
Шаблон расширяется, чтобы создать шаблон так же, как в расширении пути. Параметр раскрывается и самое длинное совпадение шаблона с его значением заменяется на строку. […] Если строка пуста, совпадения шаблона удаляются и / следующий шаблон может быть опущен. [...]
Так, "${PREPROCESSOR_DEFINTIONS/CRASHLYTICS=1}"
раскрываться PREPROCESSOR_DEFINTIONS
но удаляет все экземпляры CRASHLYTICS=1
из полученной строки.
Сингл =
это не назначение. Это сравнение равных. Bash также поддерживает ==
но, как говорится на странице руководства:
=
может быть использован вместо==
для строгого соответствия POSIX.
Итак, технически, =
является более стандартным.
Таким образом if
тестирует ли PREPROCESSOR_DEFINTIONS
не содержит CRASHLYTICS=1
, Если это действительно содержало это, тогда расширение с CRASHLYTICS=1
удаленный не будет равняться неизмененному расширению.
Конечно, это имеет смысл, учитывая echo
заявления в каждой ветви if
,