Как автоматически увеличить версию пакета в Xcode 4? - PullRequest
24 голосов
/ 09 июня 2011

Я пытаюсь выяснить, как автоматически увеличить номер версии Bundle в моем проекте Xcode 4 (для специальных и сборочных версий). Я нашел в Интернете некоторые сценарии, предназначенные для этого, но я не уверен, стоит ли размещать их в «Предварительных действиях» или «Последующих действиях». Я также не уверен, какую ценность я должен поместить в список; число, которое сценарий затем изменит или переменная?

Все варианты, которые я пробовал до сих пор, похоже, не работают, поэтому любая помощь будет принята с благодарностью.

Ниже приведен самый последний скрипт, который я пытался использовать:

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

Ответы [ 9 ]

11 голосов
/ 24 января 2013

1, установите CFBundleVersion на 1.0.1 или что-то вроде xxx

1

2, добавьте фазы сборки для запуска сценария оболочки autoVersion.sh

2

3, сохраните приведенный ниже скрипт с именем 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, запустите shell: cp autoVersion.sh ~ / Documents / и chmod 777 ~ / Documents / autoVersion.sh

5, Build & Enjoy it.:)

код Perl от: https://gist.github.com/1436598

10 голосов
/ 31 августа 2011

Вам может пригодиться следующее сообщение:

Автоинкрементные номера сборок для сборок релизов в XCode от разработки iPhone Джеффом Ламаршем http://iphonedevelopment.blogspot.com/2011/07/auto-incrementing-build-numbers-for.html

4 голосов
/ 28 июня 2013

Та же идея, что и у Аликс, но гораздо проще:

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. Это имеет преимущество в том, что также монотонно увеличивается .

1 голос
/ 20 марта 2013

Это может помочь вам.Я использую это в своих проектах.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 
# sekati@github 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}"
1 голос
/ 01 марта 2013

Для тех, кто хочет интегрировать инкрементную версию в сценарий компоновки командной строки (возможно, для непрерывной интеграции), см. Следующие команды:

    # 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

Это увеличит самый правый номер в номере версии в стиле xxx.Настроить рег-эксов, чтобы изменить для вашего соглашения.

Мне потребовалось время, чтобы я решил поделиться, чтобы вернуть сообществу!

РЕДАКТИРОВАТЬ - я создал непрерывныйсистема интеграции, которая сделает это за вас

https://github.com/adamwaite/XcodeProject

0 голосов
/ 14 марта 2019

Я не нашел отличного решения для Xcode 10.1. Я изменил некоторые сценарии, чтобы достичь цели. И теперь все отлично работает.

version=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "${INFOPLIST_FILE}")
build=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${INFOPLIST_FILE}")
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:1:DefaultValue ${version}" "${CODESIGNING_FOLDER_PATH}/Settings.bundle/Root.plist"
0 голосов
/ 23 сентября 2014

Если вы используете систему версий, такую ​​как "x.x.x", вы можете добавить этот скрипт запуска. Он будет увеличивать номер версии (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
0 голосов
/ 01 апреля 2014

FWIW - это то, что я в настоящее время использую для увеличения номера сборки только для релизных сборок (включая архивирование). Прекрасно работает под Xcode 5.1.

Просто скопируйте / вставьте фрагмент в Выполните скрипт Фаза сборки непосредственно в 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;
0 голосов
/ 21 июня 2011

Я обнаружил, что использование многоуровневого xcconfigs помогает решить эту проблему.

Работая со сложными сборками с приложениями, библиотеками и SDK, вы должны иметь возможность координировать не просто числа сборок для проекта, но и совместимость номеров сборок.

Вы можете создать заголовок управления сборкой, который по сути является текстовым файлом с номерами итераций сборки (или информацией о версиях, например, beta, dev, rel), и импортировать его через цепочку импорта xcconfig для каждого проекта.

В этот момент у вас может быть целевой шаг сценария сборки, в который будет встроена информация о вашей сборке / версии.Это также лучше всего сделать, поместив удерживающий текст в plist и запустив PlistBuddy в разделы производного файла / встроенного файла.(Таким образом, ваши изменения управления исходным кодом минимальны)

Если вы можете написать сценарий выполнения сборки, который выполняет необходимый поворот номера сборки (или, что еще лучше, использовать систему, подобную bamboo, которая создает файл для вас), выможет держать это отдельно от вашего кода.Конечно, если вам нужно сделать это и отследить, вам, возможно, придется проверить измененный номер сборки, чтобы позволить ему увеличиваться.

В результате я смог сохранить номера сборок вдольстрока: 2.0.3 b34 (3473) Где у нас есть номер сборки и точка сборки SVN checkout.(Пожалуйста, не стесняйтесь, я старая школа)

Действия Pre / Post больше подходят для уведомлений или процессов Uber: отправьте электронное письмо о том, что сборка началась / не выполнена / и т. Д. Скопируйте готовый проект на сервер готового проекта.

Все остальное работает лучше, чем сценарий сборки.

(И как всегда: заставить фазу сценария вызывать внешний файл сценария. НЕ вставляйте свой сценарий в проект, это ад на контроле исходного кодафайл проекта)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...