it-swarm.com.ru

Как автоматически увеличить версию пакета в Xcode 4?

Я пытаюсь выяснить, как автоматически увеличить номер версии 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
24
markdorison

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

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, построить и наслаждаться этим. :)

Код Perl от: https://Gist.github.com/1436598

11
TONy.W

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

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

10
Canopus

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

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

4
Anirudh Ramachandran

Это может помочь вам. Я использую его в своих проектах . 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}"
1
Alix

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

    # 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. Настроить рег-экс, чтобы изменить для вашего соглашения.

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

EDIT - я создал систему непрерывной интеграции, которая сделает это за вас

https://github.com/adamwaite/XcodeProject

1
Adam Waite

Если вы используете систему версий, такую ​​как «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
rordulu

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

Просто скопируйте/вставьте фрагмент в фазу сборки Run 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;
0
Jay

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

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

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

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

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

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

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

Все остальное работает лучше как скрипт сборки.

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

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

0
Lord Andrei