Я использовал сценарий оболочки как часть моего процесса сборки 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 . Это не очень хорошо задокументировано, но не должно быть трудным для разработки. В качестве бонуса этот репозиторий также содержит полезный скрипт для автоматического объединения сторонней библиотеки в комплект приложений.
Ответы:
Если я правильно понимаю ваш вопрос, вы хотите изменить
Project-Info.plist
файл, который является частью стандартного шаблона проекта XCode?Причина, по которой я спрашиваю это, заключается в том, что
Project-Info.plist
обычно она находится под контролем версий, и ее изменение означает, что она будет помечена как, ну, в общем, измененная.Если вас это устраивает, то следующий фрагмент обновит номер сборки и пометит файл как измененный в процессе, где
get_build_number
находится некоторый сценарий (т. Е. Заполнитель в этом примере), чтобы получить (возможно увеличенный) номер сборки, который вы хочу использовать:PlistBuddy позволяет вам установить любой ключ в файле plist, а не только номер версии. Вы можете создать все необходимые файлы plist и при необходимости включить их в ресурсы. Затем их можно прочитать из комплекта.
Что касается необходимости показывать версию на панели about и в других местах, вы также можете посмотреть настройки
CFBundleGetInfoString
иCFBundleShortVersionString
.источник
agvtool
), однако процесс модификации plist во время сборки часто ломает XCode (так как удаление сценария, которого он не имел ') t разбился один раз, когда он падал каждые 3 сборки или около того). Можно ли поместить информацию о версии в другой plist- файл и включить ее в комплект и получить доступ из приложения?get_build_number
это просто заполнитель - уточнил ответ, уточни.Я возился с множеством ответов на этот вопрос, и ни один из них меня не удовлетворил. Однако я наконец-то придумала смесь, которая мне действительно нравится!
Есть два шага, один в начале и один в конце фаз сборки.
В начале:
В конце:
Взглянув на Info.plist в XCode, вы увидите, что номер версии - «РАЗРАБОТКА», но встроенное приложение будет иметь постоянно увеличивающийся номер сборки. (Пока вы всегда делаете свои сборки из одной и той же ветки.)
Установка номера версии обратно в константную строку в конце предотвращает изменение файла Info.plist при сборке приложения.
Почему мне нравится этот метод:
источник
git rev-list --count HEAD
вместоgit rev-list HEAD | wc -l | tr -d ' '
.fastlane
для загрузки автоматических сборок таким способом, вы получите: ERROR ITMS-90058: «Этот пакет недействителен. Значение для ключа CFBundleVersion [DEVELOPMENT] в файле Info.plist должно быть разделенным периодом списком в большинство трех неотрицательных целых. "Я использовал этот список. Работает как положено. https://gist.github.com/sekati/3172554 (все права принадлежат первоначальному автору)
Скрипты, которые я модифицировал со временем.
xcode-versionString-generator.sh ,
xcode-build-number-generator.sh
Поскольку эти идеи помогают сообществу разработчиков, я создал проект GitHub. Итак, давайте развивать это хорошо. Вот проект GitHub: https://github.com/alokc83/Xcode-build-and-version-generator
Я обновил код для обоих скриптов, немного улучшив. вместо того, чтобы использовать ниже, возьмите последнюю версию от GitHub
Для версии:
Для сборки:
источник
Вся эта запись была чрезвычайно полезной. Я использовал этот трюк, но настроил свой скрипт как ловушку пост-фиксации в GIT, поэтому CFBundleVersion увеличивается после каждого успешного коммита. Скрипт хука идет в .git / hooks. Журнал остается в каталоге проекта.
Это соответствует моему самому основному критерию. Я хочу иметь возможность получить версию из GIT и перестроить ту сборку, которая была у меня ранее. Любые приращения, сделанные во время процесса сборки, этого не делают.
Вот мой сценарий:
источник
bump_build_number.sh
сценарий с момента создания.Я не знаю, какой путь самый лучший, но я опубликую ответ Apple на тот случай, если кто-то его ищет ...
Согласно этому сообщению от Apple :
Автоматизация номеров версий и сборок с помощью agvtool
Клавиши номера версии и сборки соответственно определяют маркетинговую и внутреннюю версии вашего приложения. agvtool - это инструмент командной строки, который позволяет автоматически увеличивать эти числа до следующего наибольшего числа или до определенного числа.
Номер сборки идентифицирует неизданную или выпущенную версию вашего приложения. Он хранится в Info.plist вашего приложения как
CFBundleVersion
(Bundle версия).Вы должны выполнить следующие шаги в вашем проекте XCode:
Перейдите на панель «Настройки сборки» своей цели, затем обновите ее для всех ваших конфигураций сборки следующим образом:
Ваш файл данных проекта XCode, project.pbxproj, содержит
CURRENT_PROJECT_VERSION
параметр сборки (Текущая версия проекта), который указывает текущую версию вашего проекта. agvtool ищет файл project.pbxprojCURRENT_PROJECT_VERSION
. Он продолжает работать, еслиCURRENT_PROJECT_VERSION
существует, и останавливается, в противном случае. Его значение используется для обновления номера сборки.По умолчанию Xcode не использует какую-либо систему управления версиями. Установка системы управления версиями на Apple Generic гарантирует, что Xcode будет включать всю информацию о версиях, созданную agvtool, в ваш проект.
agvtool ищет в Info.plist вашего приложения ваши версии и номера сборки. Он обновляет их, если они существуют, и ничего не делает, в противном случае. Убедитесь, что в вашем Info.plist есть ключи
CFBundleVersion
(Bundle version) и (Bundle versionCFBundleShortVersionString
string, short), как показано на рисунке ниже:Выйдите из Xcode, затем перейдите в каталог, содержащий ваш файл проекта .xcodeproj в приложении Terminal, прежде чем выполнять любую из следующих команд. Файл проекта .xcodeproj содержит project.pbxproj, который используется agvtool. (Это часть, которую вы можете запустить в сценарии вместо командной строки.)
Обновление номера версии
Чтобы обновить номер версии до определенной версии, запустите
Пример: обновить номер версии до 2.0
Обновление номера сборки
Чтобы автоматически увеличить номер сборки, запустите
Чтобы установить номер сборки вашего приложения для конкретной версии, запустите
Пример: установить номер сборки на 2.6.9
Бонус:
Чтобы просмотреть номер текущей версии, запустите
Чтобы просмотреть текущий номер сборки, запустите
источник
FWIW - это то, что я сейчас использую, чтобы увеличить номер сборки только для релизных сборок (включая архивирование). Работает нормально под Xcode 5.1.
Просто скопируйте / вставьте фрагмент в фазу сборки сценария запуска непосредственно в Xcode:
источник
Спасибо за сценарий. Работает отлично.
Мой Info.plist находится в подкаталоге с именем, содержащим пробелы, поэтому мне пришлось изменить Run Script с кавычками вокруг пути plist:
и сценарий оболочки таким же образом с кавычками вокруг всех путей:
источник
Сценарий, который я сейчас использую, очень похож на сценарий Аликс , описанный выше. Моя адаптация, ниже, добавляет проверку, чтобы делать автоинкремент только при сборке релиза / архива.
Без этого изменения будут конфликты управления версиями, так как каждый разработчик будет увеличивать номер сборки со своей скоростью. И тот факт, что история мерзавцев будет излишне загрязнена из-за постоянно меняющегося номера сборки.
Он также доступен (в несколько более простом формате для копирования и вставки) в виде GitHub .
источник
Я бы порекомендовал использовать автонаблюдение .
Xcode допускает файл заголовка (который может быть автоматически сгенерирован во время сборки, а не в самом vcs), чтобы обеспечить значения, которые будут раскрыты в info.plist во время сборки. Вы можете найти пошаговое руководство по настройке этого на веб-сайте автообзора .
Autorevision имеет тип вывода, ориентированный на заголовочные файлы этих типов, чтобы помочь именно в этих ситуациях.
источник
Autorevision
не появляется, чтобы поднять номер сборки, как требуется?VCS_NUM
должно быть то, что вы ищете ( см.autorevision.h
Пример ).Одна из проблем с некоторыми из этих решений заключается в том, что Launch Services распознает только
четырепять основных цифр в версии пакета . У меня есть проект с номером сборки, который исчисляется тысячами, поэтому я хотел использовать некоторые из менее значимых цифр.Этот сценарий Perl увеличивает все Info.plists в проекте, а не только один для текущей цели, поэтому номера сборок остаются в непрерывном режиме. Он также использует одну цифру патча и две младшие цифры, поэтому сборка 1234 имеет версию 1.23.4. Я использую его как поведение перед сборкой, поэтому оно применимо ко всем проектам, которые я создаю.
Сценарий довольно грубый, но он работает для меня.
источник
Вы можете использовать универсальные версии Apple . По сути, все, что вам нужно сделать, это позвонить
agvtool next-version -all
из каталога, в котором находится ваш файл .xcproj. Для более подробной информации проверьте URL выше.источник
Основываясь на решении Уилла Гизелера , у меня было только одно изменение, которое я хотел сделать. Его решение помещает количество коммитов git в номер сборки. Полезно, но все еще немного сложно найти фактический коммит, который создал эту сборку. Меня не очень заботило, монотонно ли увеличивается номер сборки, и поэтому я отбросил это требование, чтобы упростить доступ к коммиту, который сгенерировал данный двоичный файл.
Для этого я изменил его первый сценарий следующим образом:
Это преобразует короткую версию текущего git SHA в десятичную. Шестнадцатеричные символы не очень хорошо соответствуют требованиям к номеру сборки Apple, поэтому я должен был это сделать. Чтобы преобразовать его обратно, вы просто запустите что-то вроде этого:
в bash
<build number>
- номер сборки, которую вы получили из двоичного файла. Тогда просто бегиgit checkout $SHA
, и вот так.Поскольку это адаптация решения Уилла Гизелера , как упоминалось выше, вам также понадобится следующий сценарий после сборки:
который держит вашу историю Git в чистоте.
источник
Info.plist
, которая сама отслеживается git?Я попытался изменить процедуру, и она не сработала, потому что:
Xcode 4.2.1 изменяет подкаталог xcuserdata в .xcodeproj
git отмечает предыдущее изменение в Project-Info.plist
Следующая модификация приводит к тому, что они игнорируются и помечают только подлинные изменения:
источник
Возможно, вы захотите сделать это только тогда, когда вы архивируете (и загружаете в TF, например). В противном случае номер вашей версии может очень быстро возрасти.
В схему (Product / Edit Scheme / Archive / Pre-Actions) вы можете добавить скрипт, который будет выполняться только при архивировании.
Кроме того, вы можете сбросить номер сборки при каждом увеличении версии приложения.
И последнее, если вы используете архив вместо этого, вы можете безопасно отключить:
Поскольку номер сборки будет увеличиваться только при архивировании ...
РЕДАКТИРОВАТЬ: Исправьте то, что я сказал, предварительные действия в архиве происходят после сборки (но до архивирования), поэтому номер сборки будет увеличиваться для следующего архива ... Но вы можете создать новую схему и добавить это действие в сборку (предварительно действия) раздел этой новой схемы. и использовать эту схему, когда вы хотите создать новую сборку
источник
Я использую последнюю версию SVN для номера сборки. Если вы измените Info.plist в каталоге сборки, это не повлияет на исходный Info.plist:
источник
Я чувствую, что нашел свое племя. Племя, надеюсь, тебя позабавила версия X.
Десять лет назад, работая над рабочим пространством, в котором было более 25 проектов Xcode, я воспользовался возможностью автоматизировать версию и создать обновления строк до такой степени, которая может показаться абсурдной, если вы поддерживаете только один или два проекта со случайными обновлениями.
VersionX:
Это было весело сделать. Я узнал много о системе сборки Xcode.
Вот пример типа причудливой версии и строк сборки, которые может автоматически генерировать VersionX.
Версия X 1.0.1 β7 (c5959a3 «Чистый»)
Маркетинговая версия: VersionX 1.0.1 β7 «1.0.1 является производным от тега для фиксации, в то время как« Beta 7 »автоматически генерируется счетчиком коммитов или счетчиком сборок (например).
Версия сборки: (c5959a3 «Очистить») Отображает хэш короткой фиксации и информирует вас о том, что в каталоге сборки не было ни одного незафиксированного изменения.
VersionX (источник на GitHub) - система в стиле барокко для автоматического увеличения версии и построения строк в проектах Xcode.
Документация VersionX.
источник
Возможно, вы захотите проверить новый инструмент, который я разрабатывал, под названием Xcodebump. Он может обрабатывать обновление как CFBundleShortVersionString, так и CFBundleVersion. В качестве последнего шага он также будет регистрировать git и отмечать коммит, чтобы он соответствовал этим значениям CFBundle.
Проект Xcodebump находится здесь:
https://github.com/markeissler/Xcodebump
источник
Я обновляю
build number
следующим способом.$INFO_FILE
путь к файлу plist И$build_number
это новый номер сборки для этого здания.В общем, мой
$build_number
состоитmajor
иminor
части. Этоminor
из информации о проекте. Поэтому я опишу, как создатьmajor
часть.У меня есть 2 стратегии, чтобы решить
$build_number
.Первая стратегия
Эта стратегия использует
git tag
счет, чтобы решитьmajor
оbuild number
. Если есть53
теги проекта, он вернется53
по следующему сценарию оболочки.Как правило, это увеличивается. И это заставит разработчика поставить тег git перед публикацией.
Вторая стратегия
Пусть система Jenkins CI решит
major
роль. У него есть переменная окруженияBUILD_NUMBER
. Он увеличивается автоматически при построении системы CI. Эта информация полезна для отслеживания истории проекта в системе CI.источник
Вот обновленная версия. Это работает с Xcode 9.3.1, iOS 11.
Нажмите «Построить этапы» в целевом приложении, нажмите значок +, чтобы добавить новый сценарий выполнения, и в поле вставьте этот код.
Перейдите в файл Info.plist и установите для «Bundle version» значение 1, а для «Bundle version string, short» значение 1, вы должны быть установлены.
Создайте проект с использованием Info.plist, и вы увидите изменение версии Bundle (номера сборки).
источник
Вот мое решение. Если вы похожи на меня: терминал дружелюбен, как рубин, как семантическое управление версиями, попробуйте это.
Создайте файл с именем,
Rakefile
который содержит это:Подготовить:
gem install xcodeproj versionomy
Запустите:
rake increment:major
илиrake increment:minor
илиrake increment:tiny
когда захотите.источник
Я считаю наиболее удобным использовать Automating Version и номера сборки с помощью agvtool .
Попробуй это:
<your_app_target>
Скрипт (первая строка необязательна):
источник
Давайте сделаем это по-своему Apple. Это увеличит номер сборки после каждой успешной сборки
Я проведу вас через 5 изображений, просто пройдите.
Выберите «Редактировать схему ...» из выпадающего списка, когда вы выбираете имя своего проекта, расположенное справа от кнопки Stop_build_. Проверьте первый шаг
В левостороннем меню разверните опцию «Построить» и выберите «Пост-действия». Проверьте второй шаг.
Здесь вы можете добавить желаемые коды (скрипты), которые вы хотите выполнить после успешной сборки вашей программы. Это место, где мы должны добавить немного кода, чтобы наша автоматизация работала идеально. >> 1. Нажмите кнопку «Добавить (+)» в левом углу, чтобы добавить новый файл скрипта. >> 2. Теперь из выпадающего меню выберите «Создать действие сценария». Проверьте третий шаг.
Он имеет 3 поля >> 1. Оболочка уже назначена для вас >> 2. Теперь для «Предоставить настройки для сборки из» Выберите название проекта. >> 3. Существует большое поле для добавления вашего скрипта, просто скопируйте и вставьте туда этот код: проверьте четвертый шаг
PLIST = "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}" PLB = / usr / libexec / PlistBuddy LAST_NUMBER = $ ($ PLB -c "Печать CFBundleVersion" "$ PLIST") NEW_VERSION = $ (($ LAST_NUMBER + 1)) $ PLB -c "Набор: CFBundleVersion $ NEW_VERSION" "$ PLIST"
После завершения 4-го шага просто нажмите «Закрыть», чтобы закрыть окно, и мы должны сделать последний шаг, перейдите к файлу «plist.info» в меню «Файл проекта» и убедитесь, что ключ «Версия пакета» в разделе «Ключ» наиболее содержит пятый шаг проверки числового значения
источник