2015-04-04 3 views
2

Мне нужно настроить мою версию сборки и версии для моего проекта перед сборкой/архивированием.
Я пробовал несколько вещей, но до сих пор безрезультатно.Запустите сценарий оболочки перед сборкой в ​​Xcode

Я добавил цель со сценарием для обновления номеров и добавил, что в качестве первой зависимости от моей основной цели. Но поскольку у меня есть несколько зависимостей, поскольку у меня есть расширения в моем приложении, и все зависимости выполняются Xcode параллельно (или, по крайней мере, в случайном порядке), это не работает.

Я добавил предварительное действие к моей схеме с тем же результатом. Xcode не ждет завершения моего предварительного действия, прежде чем продолжить сборку (я добавил тест 100 для тестирования).

Поскольку я изменяю строчные номера, очень важно, чтобы скрипт мог завершиться до начала чего-либо еще, но есть еще один побочный эффект: сборка даже прекращается из-за того, что файлы plist были изменены при построении соответствующей цели.

Что затрудняет то, что я хотел бы использовать agvtools для установки моей версии & номер сборки. Это, очевидно, запускает фоновые процессы, которые не поддаются контролю, чтобы изменить плиты.

Отказ от ответственности: Я искал other answers, не помогло.

ответ

6

agvtools просто не работает в сборке Xcode. Он всегда будет останавливать сборку. Хорошо работает PlistBuddy, хотя настройка не такая приятная и аккуратная.

Я добавил Pre-Action для сборки в моей основной схеме назвать новую цель в моем проекте:

xcodebuild -project "${SRCROOT}/MAIN_APP.xcodeproj" -scheme BuildNumberPreProcess 

В мишени BuildNumberPreProcess У меня есть Run Script:

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"; 
+1

Хорошее решение! Единственный недостаток: ваши файлы Info.plist «грязны» после запуска этого, что означает, что вы постоянно проверяете обновленные файлы на свой репозиторий GIT. В идеальном мире было бы лучше оставить исходные файлы нетронутыми и просто изменить плиты в результатах сборки. – stk

+2

Я возвращаю изменения в сценарии пост-сборки;) – dogsgod

+0

Nice one! :) Сделаю это тоже, спасибо! – stk

1

Xcode есть инструменты командной строки для сборки/архивирования: https://developer.apple.com/library/ios/technotes/tn2339/_index.html

Таким образом, вы можете написать скрипт, который сначала запускает скрипт для настройки построить/номер версии, а затем запускает Xcode сборки/архив как инструмент командной строки.

+0

хорошая попытка, но это нарушает другие вещи (Организатор не будет знать о новой версии, я не могу видеть отформатированные журналы, ...) – dogsgod

Смежные вопросы