Добавить этап сборки сценария выполнения в проект Xcode из podspec

Я пытаюсь написать спецификацию Cocoapods для моей библиотеки, которая должна изменить проект Xcode и добавить «Run Script Build Phase» к цели проекта. Я подумал, что могу использовать ловушку post_install. Но "pod spec lint" говорит, что этот хук устарел:

- WARN  | [iOS] The post install hook of the specification DSL has been deprecated, use the `resource_bundles` or the `prepare_command` attributes.

Понятия не имею, как заменить хук post_install на * resource_bundles * или * prepare_command *. Кто знает другой подход к решению моей проблемы? Является ли это возможным?

И еще одна проблема - как модифицировать проект Xcode для добавления фазы сборки, но это актуально только тогда, когда решена "проблема post_hook".


person opedge    schedule 19.11.2013    source источник


Ответы (1)


Используйте рубиновый гем Xcodeproj (который является частью Cocoapods), чтобы написать сценарий, который изменяет ваш проект Xcode.

Затем вы вызываете этот сценарий с помощью prepare_command

require 'xcodeproj'
path_to_project = "${SOURCE_ROOT}/${PROJECT_NAME}.xcodeproj"
project = Xcodeproj::Project.open(path_to_project)
main_target = project.targets.first
phase = main_target.new_shell_script_build_phase("Name of your Phase")
phase.shell_script = "do sth with ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/your.file"
project.save()

Документация: http://rubydoc.info/gems/xcodeproj

Вы можете получить список переменных параметров сборки и их значений, запустив…

xcodebuild -project [ProjectName].xcodeproj -target "[TargetName]" -showBuildSettings

ОБНОВЛЕНИЕ: с тех пор, как был написан этот ответ, изменилось несколько вещей. Проблема доступа к переменным среды в настоящее время обсуждается здесь: https://github.com/CocoaPods/CocoaPods/issues/2115

person Onato    schedule 10.12.2013
comment
Есть ли простой способ добавить path_to_project? Я хочу, чтобы пользователи моего модуля просто запустили установку модуля и все было настроено для них. - person GuidoMB; 26.08.2014
comment
Возможно, вы сможете получить его из одной из переменных сборки xcode. stackoverflow.com/a/6911421/215748 - person Onato; 29.08.2014
comment
@GuidoMB Вы можете сделать current_pwd="$PWD"; project_dir=`cd "../../"; pwd`; cd "$current_pwd", тогда путь к каталогу проекта сохраняется в переменной project_dir. Затем вы можете использовать это в своем рубиновом коде, например, передав его в качестве аргумента. Создал суть с примером, включающим путь к файлу .xcodeproj, по адресу gist.github.com/niklasberglund/4534113ce7db9572e772 / а> - person Niklas Berglund; 13.09.2014
comment
Все это отлично работает, но в неправильном каталоге. Я могу заставить это выполняться только в Library / Caches / CocoaPods / Pods / ... Но не в фактическом каталоге Pods в моем проекте. Есть идеи, что мне не хватает? - person CodyMace; 16.10.2015
comment
мне нужно как-то установить SOURCE_ROOT и PROJECT_NAME? Я получаю [Xcodeproj] Unable to open / Users /.../ projects / git /.../$ {SOURCE_ROOT} / $ {PROJECT_NAME} .xcodeproj`, потому что его не существует. - person swalkner; 11.07.2016
comment
Вы запускаете это из командной строки? Эти переменные устанавливаются Xcode при запуске скрипта на этапе сборки. - person Onato; 11.07.2016
comment
У меня такая же проблема. Это когда я называю pod install. - person Liron; 02.08.2016
comment
Путь prepare_command также находится на пути podspec, а не на пути проекта. - person Liron; 02.08.2016
comment
Привет. Также появляется ошибка Unable to open при выполнении pod install. Есть ли способ найти правильный path_to_project? - person ArVan; 25.08.2016
comment
Кто-нибудь подтвердил, что это автоматически добавляет сценарий запуска к цели проекта pods? Я не получаю никаких ошибок, но я не вижу скриптов запуска в моем файле - person vonGohren; 27.01.2017
comment
prepare_command не работает с локальными модулями. Например. path => . Возможно, это ваша проблема? - person Onato; 30.01.2017
comment
он сгенерировал сценарий запуска только один раз для меня, не смог его снова сгенерировать даже после многочисленных pod install или update ... idk, что происходит - person dvdblk; 07.06.2018
comment
@Onato Как мы можем указать положение скрипта на этапах сборки? Я хотел бы добавить скрипт в начало стека. - person Ali Abbas; 07.02.2019
comment
@AliAbbas На самом деле вам нужно манипулировать массивом main_target.build_phases.delete(phase) main_target.build_phases.insert(0,phase) - person Jidong Chen; 16.05.2019