Как изменить переменные среды Xcode Build Settings из сценария фазы сборки?

Можно ли изменить переменную среды Xcode BuildSettings на этапе сборки в скрипте?

Вся идея в следующем: я хочу опубликовать опенсорсный проект с модульными тестами. Мои тесты требуют конфиденциальных данных, таких как «логин» и «пароль», поэтому я не могу их жестко закодировать. Я хочу пройти логин через среду процесса, чтобы иметь возможность сделать что-то вроде этого:

let login = ProcessInfo().environment["login"]!

Я нашел способ, как передать переменную из среды настроек сборки в процесс тестов: выберите схему «Тесты», перейдите к переменным среды и добавьте новое значение с именем «логин» и значением «$ (логин)». Если я установлю значение для «логина» прямо на вкладке настроек сборки — он будет доступен из ProcessInfo, как я и ожидал.

Но я хочу установить «логин» из файла сценария корневой папки проекта «SetupCreds.sh», который находится в .gitignore, поэтому в нем безопасно хранить логин и пароль. Итак, идея такова:

  1. Добавить сценарий этапа сборки
  2. Этот скрипт запускает «SetupCreds.sh».
  3. «SetupCreds.sh» состоит из строк экспорта, таких как export login="MyLogin

Если я добавлю echo ${login} в сценарий этапа сборки, он скажет мне, что «логин» действительно имеет значение «MyLogin». Но этот экспорт не влияет на среду Build Settings, а только на среду сценария Build Phase.

Как сделать экспорт, который переопределяет переменные среды Build Settings? Или, может быть, есть другой способ сделать то, что я хочу?


person Vladlex    schedule 16.01.2019    source источник
comment
Можно ли использовать файл xcconfig? В противном случае можно было бы включить параметр в виде файла в тестовый пакет. Например. скопируйте его на этапе сборки сценария запуска.   -  person Mats    schedule 16.01.2019
comment
Спасибо за ваш ответ. 1. Xcconfig — очень хорошее предложение, но мои конфиги генерируются подами. Кроме того, если я попытаюсь изменить конфигурацию проекта в скрипте, git это заметит. Я пытаюсь понять, как это сделать без изменений проектов, замеченных git. 2. Копирование также будет замечено git. Но идея мне нравится, и я пытаюсь понять, можно ли опционально добавить git-игнорируемый файл в цель Tests, если этот файл существует во время сборки, и не ошибиться, если этот файл отсутствует, а затем получить этот файл в тестах путем Метод Бандла. Спасибо!   -  person Vladlex    schedule 16.01.2019
comment
Да, это работает. Шаги: 1. Добавьте этап сценария сразу после сценария копирования ресурсов. 2. Содержимое скрипта: ```file=${SRCROOT}/${Tests.cfg} if test -f $file then copy_target=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.xctest/Tests.cfg cp -r $file $copy_target echo Файл Tests.cfg скопирован в ${copy_target}, иначе предупреждение echo: Файл Tests.cfg не найден. Некоторые тесты будут проигнорированы. fi ``` 3. Поместите Tests.cfg в gitignore. 4. Создайте файл Tests.cfg и заполните его конфиденциальными или специфичными для конфигурации значениями. 5. В тестах используйте Bundle.for(type(of: self).self), чтобы получить URL-адрес Tests.cfg.   -  person Vladlex    schedule 16.01.2019
comment
Можете ли вы поместить свой последний комментарий в качестве ответа? Читать в нынешнем виде довольно сложно.   -  person Declan McKenna    schedule 20.11.2019


Ответы (1)


Я скопировал ответ @Vladex, упомянутый здесь в комментариях, чтобы его было легче читать.

  1. Добавьте следующий этап сценария сразу после сценария «Копировать ресурсы».
    $file then
    copy_target="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.xctest/Tests.cfg"
    cp -r $file $copy_target echo "Tests.cfg file copied to
    ${copy_target}" else echo "warning: No Tests.cfg file found. Some
    tests will be ignored." fi 
  1. Поместите «Tests.cfg» в gitignore.
  2. Создайте файл «Tests.cfg» и заполните его конфиденциальными или специфичными для конфигурации значениями.
  3. В тестах используйте Bundle.for(type(of: self).self), чтобы получить URL "Tests.cfg".
person Declan McKenna    schedule 20.11.2019