Запустите скрипт оболочки перед сборкой в Xcode
Мне нужно настроить сборку и номер версии для моего проекта перед сборкой / архивированием.
Я перепробовал несколько вещей, но пока безрезультатно.
Я добавил цель с помощью скрипта для обновления чисел и добавил это в качестве первой зависимости к моей основной цели. Но так как у меня есть несколько зависимостей, так как у меня есть расширения в моем приложении, и все зависимости выполняются Xcode параллельно (или, по крайней мере, в случайном порядке), это не работает.
Я добавил предварительное действие в мою схему с тем же результатом. Xcode не ждет завершения моего предварительного действия, прежде чем продолжить сборку (я добавил спящий режим 100 для тестирования).
Поскольку я изменяю номера сборок, очень важно, чтобы скрипт мог завершиться до того, как что-либо еще будет запущено, но есть и еще один побочный эффект: сборка даже останавливается из-за того, что файлы plist были изменены при сборке связанных цель.
Что делает это более трудным, так это то, что я хотел бы использовать agvtools
установить мою версию и номер сборки. Это, очевидно, запускает фоновые процессы, которые находятся вне моего контроля, для изменения списков.
Отказ от ответственности: я искал другие ответы, не помогло.
2 ответа
agvtools просто не работает в сборке Xcode. Это всегда остановит сборку. Что отлично работает, так это PlistBuddy, хотя настройки не такие приятные и аккуратные.
Я добавил Pre-Action к сборке в моей основной схеме, чтобы вызвать новую цель в моем проекте:
xcodebuild -project "${SRCROOT}/MAIN_APP.xcodeproj" -scheme BuildNumberPreProcess
В целевом BuildNumberPreProcess у меня есть скрипт запуска:
VERSION=$(head -n 1 version.txt)
BUILD=`git rev-list $(git rev-parse --abbrev-ref HEAD) | wc -l | awk '{ print $1 }'`
echo "${VERSION} (${BUILD})"
SCRIPT="${SRCROOT}/CLIENT/Supporting Files/set-version-in-plist.sh"
"${SCRIPT}" "${SRCROOT}/MAIN_APP/Supporting Files/Info.plist" ${VERSION} ${BUILD}
"${SCRIPT}" "${SRCROOT}/EXTENSION/Info.plist" ${VERSION} ${BUILD}
...
набор-версию-в-plist.h:
#!/bin/sh
# set-version-in-plist.sh
#
# usage:
# set-version-in-plist LIST VERSION BUILD
# LIST: Info.plist path & name
# VERSION: version number xxx.xxx.xxx
# BUILD: build number xxxxx
#
# Location of PlistBuddy
PLISTBUDDY="/usr/libexec/PlistBuddy"
echo "$1: $2 ($3)"
${PLISTBUDDY} -c "Set :CFBundleShortVersionString $2" "$1";
${PLISTBUDDY} -c "Set :CFBundleVersion $3" "$1";
Xcode имеет инструменты командной строки для сборки / архивирования: https://developer.apple.com/library/ios/technotes/tn2339/_index.html
Таким образом, вы можете написать скрипт оболочки, который сначала запускает ваш скрипт для настройки номера сборки / версии, а затем запускает сборку / архив xcode в качестве инструмента командной строки.