Я использую оболочку script как часть процесса сборки Xcode для увеличения номера сборки в файле plist, однако это часто приводит к сбою Xcode 4.2.1 (с ошибкой о цели, не принадлежащей проекту, Я предполагаю, что изменение файла plist в некотором роде запутывает Xcode).
Оболочка script сделала это так, чтобы номер сборки увеличивался только на agvtool
, когда файл был более новым, чем файл plist (так что просто здание не увеличивало значение):
if [ -n \"`find ProjDir -newer ProjDir/Project-Info.plist`\" ]; then agvtool -noscm next-version -all; else echo \"Version not incremented\"; fi
Есть ли способ увеличить номер сборки (в файле plist или в другом месте), который не нарушает Xcode?
EDIT. Вот мое окончательное решение, основанное на предложении @Monolo. Я создал следующий script в ${PROJECT_DIR}/tools
(sibling в каталог .xcodeproj
):
#!/bin/sh
if [ $# -ne 1 ]; then
echo usage: $0 plist-file
exit 1
fi
plist="$1"
dir="$(dirname "$plist")"
# Only increment the build number if source files have changed
if [ -n "$(find "$dir" \! -path "*xcuserdata*" \! -path "*.git" -newer "$plist")" ]; then
buildnum=$(/usr/libexec/Plistbuddy -c "Print CFBundleVersion" "$plist")
if [ -z "$buildnum" ]; then
echo "No build number in $plist"
exit 2
fi
buildnum=$(expr $buildnum + 1)
/usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnum" "$plist"
echo "Incremented build number to $buildnum"
else
echo "Not incrementing build number as source files have not changed"
fi
EDIT 2: я изменил script, чтобы включить предложение @Milliways.
Затем я вызвал script из раздела "Фазы сборки" целевого сегмента Xcode:
РЕДАКТИРОВАТЬ 3. В ответ на @massimobio вам нужно добавить кавычки вокруг аргумента plist, если они содержат пробелы.
РЕДАКТИРОВАТЬ 4: просто чтобы обновить мой предпочтительный метод вызова этой сборки script, теперь нужно создать отдельную цель и настроить целевое приложение на эту цель. Это гарантирует, что он вызывается до того, как приложение-приложение сделает что-либо с plist (я заметил, что ему нравится обрабатывать plist в начале сборки). Я также переключился на чисто python-решение, которое поддерживает номер версии в отдельном файле и записывает исходные файлы версии, поскольку это более полезно для кросс-платформенных продуктов (например, Visual Studio под Windows может вызывать script, и, очевидно, сборки cmake/make-type могут также делать это). Это имеет то преимущество, что номер сборки всегда одинаковый даже на разных платформах, а также можно обновить файл Visual Studio Resource.rc
текущей версией/сборкой.
Здесь - это python script, который я использую для обновления файлов Info.plist
в проекте Xcode.