Начиная с версии 11, XCode устанавливает мое CFBundleVersion
значение в значение $(CURRENT_PROJECT_VERSION)
и мое CFBundleShortVersionString
в значение $(MARKETING_VERSION)
всякий раз, когда я ввожу значения версии или сборки в целевых настройках (вкладка «Общие»).
Фактическая версия и значения сборки, которые я ввожу, теперь хранятся в файле project.pbxproj. Я не хочу или не люблю это поведение, так как я использую сценарии оболочки для изменения значений во время сборки.
Я могу вручную установить правильные значения в файле Info.plist, но как только я изменяю номера версий или сборок в целевых настройках, файл Info.plist снова изменяется Xcode.
Как мне остановить Xcode 11 от этого?
Когда я изменяю свой скрипт сборки для изменения самого файла проекта, Xcode немедленно отменяет сборку, как только файл проекта изменяется.
источник
plistbuddy
- это хорошо и чисто, в то время как изменение файла проекта гораздо более грязное, ненадежное и подвержено непредвиденным изменениям в формате файла.Ответы:
Дорога пока
Мой вариант использования был таким:
Settigns.bundle
Раньше я выполнял точки 1 и 2 как целевой сценарий сборки, а точку 3 - как собственный сценарий на самом CI.
Новый способ хранения версии и сборки в настройках сборки Xcode вызывал проблемы со сценариями, потому что они больше не могли эффективно изменять значения. По крайней мере, чтение было возможно.
К сожалению, я не смог найти законный способ запретить Xcode хранить версию и номера сборки в настройках сборки проекта, однако мне удалось создать обходной путь.
Оказывается, что при сборке или архиве используется значение, записанное в
Info.plist
. Это означает, что значение подставляется во время сборки, что не позволяет нам изменять его в течение того же времени сборки.Я также пытался изменить проект с помощью
xcodeproj
cli, однако любые изменения в проекте приводили к остановке любых сборок, поэтому это решение не работало.В конце концов, после множества различных подходов, которые я попробовал, мне наконец удалось найти компромисс, который не нарушал бы новое поведение XCode.
Короткий ответ:
В качестве мишени предварительного действия, скрипт выполняется , который записывает соответствующие значения
CFBundleShortVersionString
иCFBundleVersion
к цели наInfo.plist
В качестве источника правды я использую настройки сборки XCode, чтобы прочитать значения
MARKETING_VERSION
иCURRENT_PROJECT_VERSION
желаемой цели.Таким образом, когда вы изменяете значения из настроек проекта - при следующей сборке / архиве - они будут записаны в
Info.plist
, что позволит продолжить работу любой существующей логики сценариев.Подробный ответ
Единственный способ изменить ресурс при выполнении действия сборки - использовать
pre-action
скрипт. Если вы попытаетесь сделать это из скрипта сборки - изменения не вступят в силу немедленно и не будут присутствовать в конце сборки / архива.Чтобы добавить действие перед сборкой - перейдите к редактированию схемы.
Затем разверните разделы «Сборка» и «Архив». Под
Pre-action
, щелкнитеProvide build and settings from
раскрывающийся список и выберите источник истинной цели, из которого вы хотите прочитать значения.Добавьте следующий скрипт:
Строки сценария делают следующее:
MARKETING_VERSION
иCURRENT_PROJECT_VERSION
Последний шаг заключается в написании собственного сценария синхронизации, который считывает значения предоставленных
MARKETING_VERSION
иCURRENT_PROJECT_VERSION
соответствующих целей / целей и в любое другое время.В моем случае скрипт выглядит следующим образом:
Я использую общий доступ
Info.plist
иSettings.bundle
между обоими целями приложения, поэтому мне нужно обновить его один раз.Также я использую расширение службы уведомлений
BadgeCounter
, которое должно иметь ту же версию и сборку, что и цель, в которую оно встроено. Так что я тоже обновляю это.источник
Не.
Предположительно, есть причина, по которой это поведение изменилось. Если более поздние функции XCode основываются на этом поведении, все становится все более и более «сконструированным» в дальнейшем.
Вместо того, чтобы пытаться согнуть XCode, измените, как сценарий сборки получает эти значения:
Как прочитать текущую версию приложения в Xcode 11 с помощью скрипта
Если вам нужно манипулировать
project.pbxproj
файлом, это список требований следующего стиля, который хорошо документирован. Вы можете использоватьplistbuddy
который совместим с этим старым форматом. Вы также можете использоватьawk
с большим количеством сценариев, если у вас есть более сложные манипуляции.Если я понимаю ваш вариант использования, вы можете написать сценарий, который получает самые высокие номера версий,
awk
а затем обновляет все более низкие номера версий, которые он может найти в файлеsed
.источник
PlistBuddy
кажется, работает нормально, но когда я используюset
команду, весь project.pbxproj преобразуется в файл XML .plist и больше не может быть прочитан Xcode. пример:PlistBuddy -c "Set :objects:$configurationId:buildSettings:CURRENT_PROJECT_VERSION $newProjectVersion" "$projectFile"
pbxproj
файл, сборка отменяется. Боюсь, это не сработает.