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,

Другие вопросы по тегам