Я использую оболочку 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.

