Depuis la version 11, Xcode définit ma CFBundleVersion
valeur à $(CURRENT_PROJECT_VERSION)
et ma CFBundleShortVersionString
valeur à $(MARKETING_VERSION)
chaque fois que j'entre des valeurs de version ou de build dans les paramètres cibles (onglet "Général").
La version réelle et les valeurs de build que j'entre sont désormais stockées dans le fichier project.pbxproj. Je ne veux pas ou n'aime pas ce comportement, car j'utilise des scripts shell pour modifier les valeurs au moment de la construction.
Je peux définir manuellement les valeurs correctes dans le fichier Info.plist, mais dès que je modifie les numéros de version ou de build dans les paramètres cibles, le fichier Info.plist est à nouveau modifié par Xcode.
Comment puis-je empêcher Xcode 11 de faire cela?
Lorsque je modifie mon script de génération pour modifier le fichier de projet lui-même, Xcode annule immédiatement la génération dès que le fichier de projet est modifié.
la source
plistbuddy
est agréable et propre, tandis que la modification du fichier de projet est beaucoup plus compliquée, peu fiable et sujette à des changements inattendus dans le format de fichier.Réponses:
La route jusqu'ici
Mon cas d'utilisation était que:
Settigns.bundle
J'avais l'habitude d'exécuter les points 1 et 2 en tant que script de build cible et le point 3 en tant que script personnalisé sur le CI lui-même.
La nouvelle façon de stocker la version et la génération dans les paramètres de génération Xcode posait des problèmes avec les scripts, car ils n'étaient plus en mesure de modifier efficacement les valeurs. Au moins, la lecture était possible.
Malheureusement, je n'ai pas pu découvrir un moyen légitime d'empêcher Xcode de stocker la version et les numéros de build dans les paramètres de construction du projet, mais j'ai réussi à créer une solution de contournement.
Il s'avère que lorsqu'une construction ou une archive est effectuée, la valeur écrite dans le
Info.plist
est utilisée. Cela signifie que la valeur est substituée pendant la construction, ce qui ne nous permet pas de la modifier pendant la même construction.J'ai également essayé de modifier le projet à l'aide de
xcodeproj
cli, mais toute modification apportée au projet entraînait l'arrêt de toutes les versions, donc cette solution ne fonctionnait pas.Finalement, après beaucoup d'approches différentes que j'ai essayées, j'ai finalement réussi à trouver un compromis qui ne violait pas le nouveau comportement du Xcode.
Réponse courte:
En tant que pré-action cible, un script est exécuté qui écrit les valeurs respectives dans
CFBundleShortVersionString
etCFBundleVersion
vers la cibleInfo.plist
Comme source de vérité, j'utilise les paramètres de construction de Xcode pour lire les valeurs de
MARKETING_VERSION
etCURRENT_PROJECT_VERSION
de la cible souhaitée.De cette façon, lorsque vous modifiez les valeurs des paramètres du projet - lors de la prochaine génération / archive - elles seront écrites dans le
Info.plist
, permettant à toute logique de script existante de continuer à fonctionner.Réponse détaillée
La seule façon de modifier une ressource lors d'une action de génération est d'utiliser un
pre-action
script. Si vous essayez de le faire à partir d'un script de build - les modifications ne prendront pas effet immédiatement et ne seront pas présentes à la fin de la build / archive.Pour ajouter une action de pré-construction - allez dans le schéma d'édition.
Développez ensuite les sections Build et Archive. Sous
Pre-action
, cliquez sur leProvide build and settings from
menu déroulant et sélectionnez la source de cible de vérité à partir de laquelle vous souhaitez lire les valeurs.Ajoutez le script suivant:
Les lignes de script font ce qui suit:
MARKETING_VERSION
etCURRENT_PROJECT_VERSION
La dernière étape consiste à écrire votre propre script de synchronisation qui lit les valeurs du fourni
MARKETING_VERSION
etCURRENT_PROJECT_VERSION
à la cible / s respectifs et chaque fois que vous le souhaitez.Dans mon cas, le script est le suivant:
J'utilise partagé
Info.plist
etSettings.bundle
entre mes deux cibles d'application, donc je dois le mettre à jour une fois.J'utilise également une extension de service de notification
BadgeCounter
, qui doit avoir exactement la même version et être la cible dans laquelle elle est intégrée. Je mets donc cela à jour également.la source
Non.
Vraisemblablement, il y a une raison pour laquelle ce comportement a changé. Si les fonctionnalités Xcode ultérieures s'appuient sur ce comportement, les choses deviennent de plus en plus "construites" sur toute la ligne.
Au lieu d'essayer de plier Xcode, modifiez la façon dont le script de génération récupère ces valeurs:
Comment lire la version actuelle de l'application dans Xcode 11 avec un script
Si vous devez manipuler le
project.pbxproj
fichier, c'est une liste de styles Next qui est bien documentée. Vous pouvez utiliserplistbuddy
ce qui est compatible avec cet ancien format. Vous pouvez également utiliserawk
avec plus de scripts si vous avez des manipulations plus complexes.Si je comprends votre cas d'utilisation, vous pouvez écrire un script qui obtient les numéros de version les plus élevés avec
awk
puis met à jour tous les numéros de version inférieurs qu'il peut trouver dans le fichiersed
.la source
PlistBuddy
semble fonctionner correctement, mais lorsque j'utilise laset
commande, l'ensemble du projet.pbxproj est converti en un fichier XML .plist et ne peut plus être lu par Xcode. exemple:PlistBuddy -c "Set :objects:$configurationId:buildSettings:CURRENT_PROJECT_VERSION $newProjectVersion" "$projectFile"
pbxproj
fichier, la construction sera annulée. Donc ça ne va pas vraiment marcher, je le crains.