Запустите скрипт оболочки перед сборкой в ​​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 в качестве инструмента командной строки.

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