Лучший способ увеличить номер сборки? - PullRequest
132 голосов
/ 13 февраля 2012

Я использовал сценарий оболочки как часть моего процесса сборки Xcode, чтобы увеличить номер сборки в файле plist , однако это часто приводит к аварийному завершению Xcode 4.2.1 (с ошибкой относительно цели непринадлежность к проекту; я предполагаю, что изменение файла plist каким-то образом сбивает с толку Xcode.

Сценарий оболочки сделал это так, что номер сборки увеличивается только на 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?

ФИНАЛЬНОЕ РЕДАКТИРОВАНИЕ : сейчас я делаю такие вещи, используя скрипт на Python, который у меня естьобнародован на github .Это не очень хорошо документировано, но не должно быть трудным для разработки.В качестве бонуса этот репозиторий также содержит полезный скрипт для автоматического объединения сторонней библиотеки в комплект приложения.

Ответы [ 21 ]

69 голосов
/ 15 июля 2014

Я возился с большим количеством ответов на этот вопрос, и ни один из них меня не удовлетворил. Тем не менее, я наконец-то придумал смесь, которая мне действительно нравится!

Есть два шага: один в начале и один в конце фаз сборки.

В начале:

# Set the build number to the count of Git commits
buildNumber=$(git rev-list HEAD | wc -l | tr -d ' ')
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

В конце:

# Set the build number to "DEVELOPMENT"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion DEVELOPMENT" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Глядя на Info.plist в XCode, вы увидите, что номер версии - «РАЗРАБОТКА», но сборочное приложение будет иметь постоянно увеличивающийся номер сборки. (Пока вы всегда делаете свои сборки из одной и той же ветви.)

Установка номера версии обратно в константную строку в конце предотвращает изменение файла Info.plist при сборке приложения.

Почему мне нравится этот метод:

  • Easy
  • Не загрязняет историю версий Git
  • CFBundleVersion полностью автоматический
  • Красивый номер версии может быть изменен, когда я захочу
38 голосов
/ 18 марта 2013

Я использовал этот список, он потрясающий и работает как положено.https://gist.github.com/sekati/3172554 (все кредиты принадлежат первоначальному автору)

Sctipts, которые я изменил за это время.

xcode-versionString-generator.sh ,

xcode-build-number-generator.sh

Поскольку эти сущности помогают сообществу разработчиков.Я думал сделать проект GitHub из этого.Так что давайте развивать это хорошо.Вот проект github: https://github.com/alokc83/Xcode-build-and-version-generator

Я обновил код для обоих сценариев, немного улучшив его.вместо использования ниже выберите последнюю версию github

Для версии:

# xcode-version-bump.sh
# @desc Auto-increment the version number (only) when a project is archived for export. 
# @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. Check the checkbox "Run script only when installing"
# 6. Drag the "Run Script" below "Link Binaries With Libraries"
# 7. Insure your starting version number is in SemVer format (e.g. 1.0.0)

# This splits a two-decimal version string, such as "0.45.123", allowing us to increment the third position.
VERSIONNUM=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}")
NEWSUBVERSION=`echo $VERSIONNUM | awk -F "." '{print $3}'`
NEWSUBVERSION=$(($NEWSUBVERSION + 1))
NEWVERSIONSTRING=`echo $VERSIONNUM | awk -F "." '{print $1 "." $2 ".'$NEWSUBVERSION'" }'`
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $NEWVERSIONSTRING" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Для сборки:

# xcode-build-bump.sh
# @desc Auto-increment the build number every time the project is run. 
# @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"
# 6. Insure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
29 голосов
/ 15 февраля 2012

Если я правильно понимаю ваш вопрос, вы хотите изменить файл Project-Info.plist, который является частью стандартного шаблона проекта XCode?

Причина, по которой я спрашиваю это, заключается в том, что Project-Info.plist обычно находится под контролем версий, и его изменение означает, что оно будет помечено как, ну, в общем, измененное.

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

#!/bin/sh

# get_build_number is a placeholder for your script to get the latest build number
build_number = `get_build_number`

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${build_number}" ProjDir/Project-Info.plist

PlistBuddy позволяет вам установить любой ключ в файле plist, а не только номер версии.Вы можете создать все необходимые файлы plist и при необходимости включить их в ресурсы.Затем их можно прочитать из пакета.

Что касается необходимости показывать версию на панели about и в других местах, вы также можете посмотреть настройки CFBundleGetInfoString и CFBundleShortVersionString.

14 голосов
/ 07 февраля 2013

Вся эта запись была чрезвычайно полезной. Я использовал этот трюк, но настроил свой сценарий как ловушку после коммита в GIT, поэтому CFBundleVersion увеличивается после каждого успешного коммита. Скрипт хука идет в .git / hooks. Журнал остается в каталоге проекта.

Это соответствует моему самому основному критерию. Я хочу иметь возможность получить версию из GIT и перестроить ту сборку, которая была у меня ранее. Любые приращения, сделанные в процессе сборки, этого не делают.

Вот мой сценарий:

#!/bin/sh
#
# post-commit
#
# This script increments the CFBundleVersion for each successful commit
#

plist="./XYZZY/XYZZY-Info.plist"
buildnum=$(/usr/libexec/Plistbuddy -c "Print CFBundleVersion" "$plist")
if [ -z "$buildnum" ]; then
    exit 1
fi
buildnumplus=$(expr $buildnum + 1)
/usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnumplus" "$plist"

echo $(date) "- Incremented CFBundleVersion to" $buildnumplus >> hookLog.txt
14 голосов
/ 25 февраля 2016

Я не знаю, какой путь самый лучший, но я опубликую ответ Apple на тот случай, если кто-то его ищет ...

Согласно этому посту вопросов и ответов Apple :

Автоматизация номеров версий и сборок с помощью agvtool

Клавиши с номерами версий и сборок соответственно определяют маркетинговую и внутреннюю версии вашего приложения.agvtool - это инструмент командной строки, который позволяет автоматически увеличивать эти числа до следующего наибольшего числа или до определенного числа.

Номер сборки идентифицирует невыпущенную или выпущенную версию вашего приложения.Он сохраняется в Info.plist вашего приложения как CFBundleVersion (версия пакета).

Вы должны выполнить следующие шаги в своем проекте XCode:

  1. Включить agvtool

Перейдите на панель «Настройки сборки» ввашей цели, затем обновите ее для всех ваших конфигураций сборки следующим образом:

  • Установите для текущей версии проекта значение по вашему выбору.

Ваш файл данных проекта Xcode, проект.pbxproj, включает параметр сборки CURRENT_PROJECT_VERSION (Текущая версия проекта), который указывает текущую версию вашего проекта.agvtool ищет в файле project.pbxproj CURRENT_PROJECT_VERSION.Он продолжает работать, если существует CURRENT_PROJECT_VERSION, и останавливается, в противном случае.Его значение используется для обновления номера сборки.

  • Установите для системы управления версиями Apple Generic.

По умолчанию Xcode не использует какую-либо систему управления версиями.Установка системы управления версиями на Apple Generic гарантирует, что Xcode будет включать в ваш проект всю информацию, генерируемую agvtool.

Set Versioning System to Apple Generic

Настройка версии и номера сборки

agvtool выполняет поиск в Info.plist вашего приложения для поиска версии и номера сборки.Он обновляет их, если они существуют, и ничего не делает, в противном случае.Убедитесь, что в вашем Info.plist есть ключи CFBundleVersion (версия пакета) и CFBundleShortVersionString (строка версии пакета, короткие), как показано на рисунке ниже:

Set up your version and build numbers

Выйдите из Xcode, затем перейдите в каталог, содержащий ваш файл проекта .xcodeproj в приложении Terminal, прежде чем запускать любую из следующих команд.Файл проекта .xcodeproj содержит project.pbxproj, который используется agvtool.(Это часть, которую вы можете запустить в сценарии вместо командной строки.)

Обновление номера версии

Чтобы обновить номер версии до определенной версии, запустите

xcrun agvtool new-marketing-version <your_specific_version>

Пример: Обновление номера версии до 2.0

xcrun agvtool new-marketing-version 2.0

Обновление номера сборки

Для автоматическогоувеличьте свой номер сборки, запустите

xcrun agvtool next-version -all

Чтобы установить номер сборки вашего приложения для конкретной версии, запустите

xcrun agvtool new-version -all <your_specific_version>

Пример: Установите номер сборкидо 2.6.9

xcrun agvtool new-version -all 2.6.9

Бонус:

Чтобы просмотреть номер текущей версии, запустите

xcrun agvtool what-marketing-version

Чтобы просмотреть номер текущей сборки, запустить

xcrun agvtool what-version
11 голосов
/ 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;
7 голосов
/ 03 июля 2012

Спасибо за скрипт. Отлично работает.

Мой Info.plist находится в подкаталоге с именем, содержащим пробелы, поэтому мне пришлось модифицировать скрипт запуска с кавычками вокруг пути plist:

${PROJECT_DIR}/tools/bump_build_number.sh "${PROJECT_DIR}/${INFOPLIST_FILE}"

и сценарий оболочки аналогично с кавычками по всем путям:

#!/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
6 голосов
/ 28 марта 2015

Сценарий, который я сейчас использую, очень основан на Alix's , выше.Моя адаптация, приведенная ниже, добавляет проверку, чтобы делать автоинкремент только для сборки выпуска / архива.

Без этого изменения будут конфликты управления версиями, поскольку каждый разработчик будет увеличивать номер сборки с собственной скоростью,И тот факт, что история git будет излишне загрязнена из-за постоянно меняющегося номера сборки.

# xcode-build-bump.sh
# @desc Auto-increment Xcode target build number every time the project is archived
# @src stackoverflow.com/a/15483906
# @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"
# 6. Insure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)

if [ "Release" != "${CONFIGURATION}" ]
then
    exit 0
fi

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Он также доступен (в немного более простом формате для копирования и вставки) в виде GitHub gist.

5 голосов
/ 29 августа 2013

Я бы порекомендовал использовать autorevision .

Xcode допускает файл заголовка (который может быть автоматически сгенерирован во время сборки, а не в самом vcs), чтобы обеспечить значения, которыебудет расширен в info.plist во время сборки.Пошаговое руководство по настройке этого параметра можно найти на веб-сайте autorevision .

. Функция Autorevision имеет выходной тип, ориентированный на заголовочные файлы этих типов, чтобы помочь именно в этих ситуациях.

4 голосов
/ 31 августа 2015

Вы можете использовать универсальную версию Apple .По сути, все, что вам нужно сделать, это вызвать agvtool next-version -all из каталога, в котором находится ваш файл .xcproj.Для более подробной информации проверьте URL выше.

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