Ответ 1
Вы можете найти следующее сообщение:
Auto-Incrementing Build Numbers для выпусков сборки в Xcodefrom iPhone Development Джефф ЛаМарче http://iphonedevelopment.blogspot.com/2011/07/auto-incrementing-build-numbers-for.html
Я пытаюсь выяснить, как автоматически увеличить число версий Bundle в моем проекте Xcode 4 (для специальных и выпускных сборок). Я нашел несколько сценариев в Интернете, которые претендуют на это, но я не уверен, разместить их в "Pre-actions" или "Post-actions". Я также не уверен, какую ценность я должен разместить в plist; число, которое script затем изменит или переменную?
Все варианты, которые я пробовал до сих пор, похоже, не работают, поэтому любая помощь будет принята с благодарностью.
Ниже приведен самый последний script, который я пытался использовать:
conf=${CONFIGURATION}
arch=${ARCHS:0:4}
# Only increase the build number on Device and AdHoc/AppStore build
if [ $conf != "Debug" ] && [ $conf != "Release" ] && [ $arch != "i386" ]
then
buildPlist=${INFOPLIST_FILE}
buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBuildVersion" $buildPlist)
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBuildNumber" $buildPlist)
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBuildNumber $buildNumber" $buildPlist
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildVersion.$buildNumber" $buildPlist
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildVersion.$buildNumber" $buildPlist
fi
Вы можете найти следующее сообщение:
Auto-Incrementing Build Numbers для выпусков сборки в Xcodefrom iPhone Development Джефф ЛаМарче http://iphonedevelopment.blogspot.com/2011/07/auto-incrementing-build-numbers-for.html
1, установите CFBundleVersion в 1.0.1 или что-то вроде x.x.x
2, добавьте фазы сборки для запуска оболочки script autoVersion.sh
3, сохраните ниже script с именем autoVersion.sh
#!/bin/sh
# Auto Increment Version Script
# set CFBundleVersion to 1.0.1 first!!!
# the perl regex splits out the last part of a build number (ie: 1.1.1) and increments it by one
# if you have a build number that is more than 3 components, add a '\.\d+' into the first part of the regex.
buildPlist=${INFOPLIST_FILE}
newVersion=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$buildPlist" | /usr/bin/perl -pe 's/(\d+\.\d+\.)(\d+)/$1.($2+1)/eg'`
#echo $newVersion;
/usr/libexec/PListBuddy -c "Set :CFBundleVersion $newVersion" "$buildPlist"
4, запустите оболочку: cp autoVersion.sh ~/Documents/и chmod 777 ~/Documents/autoVersion.sh
5, Постройте и наслаждайтесь.:)
perl-код из: https://gist.github.com/1436598
Те же идеи, что и Alix, но гораздо проще:
buildNumber=`/bin/date +%Y%m%d%H%M%S`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
Добавьте это как элемент Run Script
в Build Phases
на ваш Target
. Преимущество состоит в том, что монотонно увеличивается.
Для тех, кто хочет интегрировать расширение версии в сборку командной строки script (возможно, для непрерывной интеграции), см. следующие команды:
# cd into the project folder containing the plist
cd /Users/waitea/iOS/E.ON/iOS/trunk/Eon
# grab the version numbers
major_version=$(grep -C 2 CFBundleVersion App-Info.plist | grep -o '[0-9]\+.[0-9]\+.[0-9]\+')
major_version_min=$(echo $major_version | grep -o '[0-9]\+.[0-9]\+\.')
minor_version=$(echo $major_version | grep -o '[0-9]\+$')
# increment the minor version
increment=`expr $minor_version + 1`
incremented_whole_version="$major_version_min$increment"
# replace the build number in the plist using perl
/usr/bin/perl -p -i -e "s/$major_version/$incremented_whole_version/g" App-Info.plist
Это приведет к увеличению самого правого числа в номере версии стиля x.x.x. Подстройте reg-ex для изменения для вашего соглашения.
Потратил меня на то, чтобы подумать, что я поделюсь, чтобы вернуть сообщество!
EDIT - я создал систему непрерывной интеграции, которая сделает это для вас
Это может вам помочь. Я использую его в своих проектах. https://gist.github.com/alokc83/5207294
#!/bin/sh
# xcode-build-number-generator.sh
# @desc Automaticvally create build number every time using curent day, month and year
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below in to new "Run Script" section
# 5. Drag the "Run Script" below "Link Binaries With Libraries"
#Credits
# [email protected] for intial direction about automatic versioning
# http://www.codinghorror.com/blog/2007/02/whats-in-a-version-number-anyway.html (For unferstanding the Software Versoining)
#Feel free to leave comment or report issues
MONTH=`date | awk '{print $2}'`
case "$MONTH" in
'Jan' )
MONTHNUMBER=1
;;
'Feb' )
MONTHNUMBER=2
;;
'Mar' )
MONTHNUMBER=3
echo "Month is $MONTHNUMBER"
;;
'Apr' )
MONTHNUMBER=4
;;
'May' )
MONTHNUMBER=5
;;
'Jun' )
MONTHNUMBER=6
;;
'Jul' )
MONTHNUMBER=7
;;
'Aug' )
MONTHNUMBER=8
;;
'Sep' )
MONTHNUMBER=9
;;
'Oct' )
MONTHNUMBER=10
;;
'Nov' )
MONTHNUMBER=11
;;
'Dec' )
MONTHNUMBER=12
;;
esac
DATE=`date | awk '{print $3}'`
echo "Date = $DATE"
YEAR=`date | awk '{print $6}'`
echo "Date = $YEAR"
### only uncomment section below if testing the format in terminal
#echo "BuildNumber1 = $MONTH$DATE$YEAR"
#echo "or BUILD NUMBER = $DATE$MONTH$YEAR"
#echo "or BUILD NUMBER = $MONTHNUMBER$DATE$YEAR Format is |Month Number Date Year|"
#echo "or BUILD NUMBER = $DATE$MONTHNUMBER$YEAR format is |Date MonthNumber Year|"
############################
#### Uncomment only one one style or last one will be in effect
#buildNumber=$MONTH$DATE$YEAR
#buildNumber=$DATE$MONTH$YEAR
buildNumber=$MONTHNUMBER$DATE$YEAR
#buildNumber=$DATE$MONTHNUMBER$YEAR
echo "Final Build number is $buildNumber"
## Below command write buildNumber in the property list
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
Я обнаружил, что использование многоуровневых xcconfigs помогает этой проблеме.
Работая над сложными сборками с приложениями, библиотеками и SDK, вы должны иметь возможность координировать не просто создание номеров для каждого проекта, но и совместимость номера сборки.
Вы можете создать заголовок управления сборкой, который является фактически текстовым файлом с номерами итераций сборки (или информацией о версиях, то есть бета, dev, rel) и импортировать ее через цепочку импорта xcconfig для каждого проекта.
В этот момент вы можете создать шаг сборки script, который будет встраивать вашу информацию о build/versioning. Это также лучше всего сделать, поместив текст в ваш plist и запустив PlistBuddy в ваши производные файлы/построенные разделы файлов. (Таким образом, ваши изменения управления версиями минимальны)
Если вы можете написать выполнение сборки script, которое делает нужное количество строк сборки (или, еще лучше, используйте такую систему, как bamboo, которая создает файл для вас), вы можете сохранить это отдельно от своего кода. Если вам нужно сделать это и отслеживать, вам может потребоваться проверить измененный номер сборки, чтобы он мог увеличиваться.
В результате я смог сохранить номера строчек вдоль строки: 2.0.3 b34 (3473) Где у нас есть номер сборки и точка сборки проверки SVN. (Пожалуйста, нет git дедовщина, я старая школа)
Действия Pre/Post больше для уведомлений или процессов Uber: Электронная почта, что сборка началась/не удалось /etc Скопируйте выполненный проект на готовый сервер проекта.
Все остальное работает лучше, чем Build Script.
(И как всегда: сделайте фазовый вызов script внешним script файлом. НЕ вставляйте ваш script в проект, черт возьми, источник, управляющий файлом проекта)
Надеюсь, что это поможет.
FWIW - это то, что я сейчас использую, чтобы увеличить номер сборки только для релизов (включая архивирование). Работает отлично под Xcode 5.1.
Просто скопируйте/вставьте фрагмент в фазу выполнения script непосредственно в Xcode:
buildnum=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$PRODUCT_SETTINGS_PATH")
if [ "$CONFIGURATION" = "Release" ]; then
buildnum=$((buildnum + 1))
echo "Build number updated to $buildnum"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildnum" "$PRODUCT_SETTINGS_PATH"
fi;
Если вы используете систему версий типа "x.x.x", вы можете добавить этот прогон script. Он будет увеличивать номер версии (x.x.x + 1) каждый раз при создании новой сборки:
if [ "${CONFIGURATION}" != "Debug" ]; then
VERSIONNUM=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
NEWSUBVERSION=`echo $VERSIONNUM | awk -F "." '{print $4}'`
NEWSUBVERSION=$(($NEWSUBVERSION + 1))
NEWVERSIONSTRING=`echo $VERSIONNUM | awk -F "." '{print $1 "." $2 "." $3 ".'$NEWSUBVERSION'" }'`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $NEWVERSIONSTRING" "${PROJECT_DIR}/${INFOPLIST_FILE}"
fi