Seit Version 11 setzt Xcode meinen CFBundleVersion
Wert auf $(CURRENT_PROJECT_VERSION)
und meinen CFBundleShortVersionString
Wert auf, $(MARKETING_VERSION)
wenn ich in den Zieleinstellungen Versions- oder Build-Werte eingebe (Registerkarte "Allgemein").
Die von mir eingegebenen tatsächlichen Versions- und Buildwerte werden jetzt in der Datei project.pbxproj gespeichert. Ich möchte oder mag dieses Verhalten nicht, da ich Shell-Skripte verwende, um die Werte zur Erstellungszeit zu ändern.
Ich kann die korrekten Werte in der Datei Info.plist manuell festlegen. Sobald ich jedoch die Versions- oder Build-Nummern in den Zieleinstellungen ändere, wird die Datei Info.plist von Xcode erneut geändert.
Wie kann ich verhindern, dass Xcode 11 dies tut?
Wenn ich mein Build-Skript so ändere, dass die Projektdatei selbst geändert wird, bricht Xcode den Build sofort ab, sobald die Projektdatei geändert wird.
quelle
plistbuddy
ist nett und sauber, während das Ändern der Projektdatei viel chaotischer, unzuverlässiger und anfällig für unerwartete Änderungen im Dateiformat ist.Antworten:
Der Weg bisher
Mein Anwendungsfall war:
Settigns.bundle
Ich habe Punkt 1 und 2 als Zielerstellungsskript und Punkt 3 als benutzerdefiniertes Skript auf dem CI selbst ausgeführt.
Die neue Art, die Version und den Build in den Xcode-Build-Einstellungen zu speichern, verursachte Probleme mit den Skripten, da die Werte nicht mehr effektiv geändert werden konnten. Zumindest war Lesen möglich.
Leider konnte ich keinen legitimen Weg finden, um zu verhindern, dass Xcode die Version speichert und Nummern in die Projekterstellungseinstellungen einbaut, aber ich habe es geschafft, eine Problemumgehung zu erstellen.
Es stellt sich heraus, dass beim Erstellen eines Builds oder Archivs der in geschriebene Wert
Info.plist
verwendet wird. Dies bedeutet, dass der Wert während der Erstellungszeit ersetzt wird, sodass wir ihn nicht während derselben Erstellungszeit ändern können.Ich habe auch versucht, das Projekt mit
xcodeproj
cli zu ändern. Änderungen am Projekt führten jedoch dazu, dass Builds gestoppt wurden, sodass diese Lösung nicht funktionierte.Nach vielen verschiedenen Ansätzen, die ich ausprobiert habe, habe ich es endlich geschafft, einen Kompromiss zu finden, der das neue Verhalten des Xcodes nicht verletzt.
Kurze Antwort:
Als Zielvoraktion wird ein Skript ausgeführt, das die entsprechenden Werte in
CFBundleShortVersionString
undCFBundleVersion
in die Ziele schreibtInfo.plist
Als Quelle der Wahrheit, verwende ich die Xcode Build - Einstellungen die Werte zu lesen
MARKETING_VERSION
undCURRENT_PROJECT_VERSION
des gewünschten Ziels.Auf diese Weise werden beim Ändern der Werte aus den Projekteinstellungen - beim nächsten Erstellen / Archivieren - diese in das geschrieben
Info.plist
, sodass Ihre vorhandene Skriptlogik weiterhin funktioniert.Detaillierte Antwort
Die einzige Möglichkeit, eine Ressource bei einer Build-Aktion zu ändern, ist die Verwendung eines
pre-action
Skripts. Wenn Sie versuchen, dies über ein Build-Skript zu tun, werden die Änderungen nicht sofort wirksam und sind am Ende des Builds / Archivs nicht vorhanden.Um eine vorgefertigte Aktion hinzuzufügen, gehen Sie zum Bearbeitungsschema.
Erweitern Sie dann die Abschnitte Erstellen und Archivieren. Unter
Pre-action
der klickenProvide build and settings from
Drop - Down und die Quelle der Wahrheit Ziel auszuwählen , von dem Sie die Werte lesen möchten.Fügen Sie das folgende Skript hinzu:
Die Skriptzeilen führen Folgendes aus:
MARKETING_VERSION
und angebenCURRENT_PROJECT_VERSION
Der letzte Schritt besteht darin, ein eigenes Synchronisierungsskript zu schreiben, das die Werte der bereitgestellten
MARKETING_VERSION
undCURRENT_PROJECT_VERSION
der jeweiligen Ziele liest und wann immer Sie möchten.In meinem Fall lautet das Skript wie folgt:
Ich verwende Shared
Info.plist
undSettings.bundle
zwischen meinen beiden App-Zielen, daher muss ich dies einmal aktualisieren.Außerdem verwende ich eine Benachrichtigungsdiensterweiterung
BadgeCounter
, die genau dieselbe Version haben und als Ziel erstellt werden muss, in das sie eingebettet ist. Also aktualisiere ich das auch.quelle
Tu es nicht.
Vermutlich gibt es einen Grund, warum sich dieses Verhalten geändert hat. Wenn spätere Xcode-Funktionen auf diesem Verhalten aufbauen, werden die Dinge auf der ganzen Linie immer mehr "konstruiert".
Anstatt zu versuchen, Xcode zu biegen, ändern Sie, wie das Build-Skript diese Werte abruft:
Lesen der aktuellen App-Version in Xcode 11 mit Skript
Wenn Sie die
project.pbxproj
Datei bearbeiten müssen, handelt es sich um eine gut dokumentierte Plist im nächsten Stil. Sie können verwenden,plistbuddy
welches mit diesem alten Format kompatibel ist. Sie können auchawk
mit mehr Skripten arbeiten, wenn Sie komplexere Manipulationen haben.Wenn ich Ihren Anwendungsfall verstehe, können Sie ein Skript schreiben, mit dem die höchsten Versionsnummern abgerufen werden,
awk
und dann alle niedrigeren Versionsnummern aktualisieren, die in der Datei enthalten sindsed
.quelle
PlistBuddy
scheint gut zu funktionieren, aber wenn ich denset
Befehl verwende, wird die gesamte project.pbxproj in eine XML .plist-Datei konvertiert und kann von Xcode nicht mehr gelesen werden. Beispiel:PlistBuddy -c "Set :objects:$configurationId:buildSettings:CURRENT_PROJECT_VERSION $newProjectVersion" "$projectFile"
pbxproj
Datei ändert , der Build abgebrochen wird. Ich fürchte, das wird nicht wirklich funktionieren.