Od wersji 11 Xcode ustawia moją CFBundleVersion
wartość na $(CURRENT_PROJECT_VERSION)
i moją CFBundleShortVersionString
wartość, $(MARKETING_VERSION)
ilekroć wprowadzę wartości wersji lub kompilacji w ustawieniach docelowych (karta „Ogólne”).
Rzeczywiste wartości wersji i kompilacji, które wprowadzam, są teraz przechowywane w pliku project.pbxproj. Nie chcę ani nie podoba mi się to zachowanie, ponieważ używam skryptów powłoki do modyfikowania wartości podczas kompilacji.
Mogę ręcznie ustawić prawidłowe wartości w pliku Info.plist, ale jak tylko zmienię numery wersji lub kompilacji w ustawieniach docelowych, plik Info.plist zostanie ponownie zmieniony przez Xcode.
Jak powstrzymać Xcode 11 przed zrobieniem tego?
Po zmodyfikowaniu skryptu kompilacji w celu zmiany samego pliku projektu Xcode natychmiast anuluje kompilację, gdy tylko plik projektu zostanie zmieniony.
źródło
plistbuddy
jest miłe i czyste, podczas gdy modyfikowanie pliku projektu jest znacznie bardziej niechlujne, zawodne i podatne na nieoczekiwane zmiany formatu pliku.Odpowiedzi:
Droga do tej pory
Mój przypadek użycia był taki:
Settigns.bundle
Kiedyś wykonywałem punkt 1 i 2 jako docelowy skrypt kompilacji, a punkt 3 jako skrypt niestandardowy w samym CI.
Nowy sposób przechowywania wersji i kompilacji w ustawieniach kompilacji Xcode powodował problemy ze skryptami, ponieważ nie były one już w stanie skutecznie modyfikować wartości. Możliwe było przynajmniej czytanie.
Niestety nie byłem w stanie odkryć prawidłowego sposobu zapobiegania przechowywaniu przez Xcode wersji i numerów kompilacji w ustawieniach kompilacji projektu, jednak udało mi się stworzyć obejście.
Okazuje się, że przy tworzeniu kompilacji lub archiwum
Info.plist
używana jest wartość zapisana w . Oznacza to, że wartość jest zastępowana w czasie kompilacji, co nie pozwala nam jej modyfikować w tym samym czasie kompilacji.Próbowałem również zmodyfikować projekt przy użyciu
xcodeproj
cli, jednak wszelkie zmiany w projekcie powodowały zatrzymanie wszelkich kompilacji, więc to rozwiązanie nie działało.W końcu, po wielu różnych podejściach, które wypróbowałem, w końcu udało mi się znaleźć kompromis, który nie naruszał nowego zachowania Xcode.
Krótka odpowiedź:
Jako cel przed działaniem wykonywany jest skrypt, który zapisuje odpowiednie wartości do
CFBundleShortVersionString
iCFBundleVersion
do celuInfo.plist
Jako źródło prawdy używam ustawień kompilacji Xcode do odczytywania wartości
MARKETING_VERSION
iCURRENT_PROJECT_VERSION
pożądanego celu.W ten sposób, gdy zmodyfikujesz wartości z ustawień projektu - przy następnym kompilacji / archiwum - zostaną one zapisane w
Info.plist
, pozwalając na dowolne, jeśli twoja logika skryptowa będzie dalej działać.Szczegółowa odpowiedź
Jedynym sposobem modyfikacji zasobu po akcji kompilacji jest użycie
pre-action
skryptu. Jeśli spróbujesz to zrobić ze skryptu kompilacji - zmiany nie zostaną zastosowane natychmiast i nie będą obecne na końcu kompilacji / archiwum.Aby dodać akcję przed kompilacją - przejdź do schematu edycji.
Następnie rozwiń sekcje Kompilacja i Archiwum. Poniżej
Pre-action
kliknijProvide build and settings from
menu rozwijane i wybierz źródło prawdy, z którego chcesz odczytać wartości.Dodaj następujący skrypt:
Linie kreski wykonują następujące czynności:
MARKETING_VERSION
iCURRENT_PROJECT_VERSION
Ostatnim krokiem jest napisanie własnego skryptu synchronizacji, który odczytuje wartości podanego
MARKETING_VERSION
iCURRENT_PROJECT_VERSION
odpowiedniego celu / ów i kiedy tylko chcesz.W moim przypadku skrypt jest następujący:
Używam współdzielonych
Info.plist
iSettings.bundle
między dwoma celami mojej aplikacji, więc muszę to zaktualizować raz.Używam również rozszerzenia usługi powiadomień
BadgeCounter
, które musi mieć tę samą wersję i kompilację, co obiekt docelowy, w którym jest osadzone. Więc aktualizuję to również.źródło
Nie rób
Przypuszczalnie istnieje powód, dla którego to zachowanie się zmieniło. Jeśli późniejsze funkcje Xcode opierają się na tym zachowaniu, rzeczy stają się coraz bardziej „konstruowane” wzdłuż linii.
Zamiast próbować zginać Xcode, zmień sposób, w jaki skrypt kompilacji pobiera te wartości:
Jak czytać aktualną wersję aplikacji w Xcode 11 ze skryptem
Jeśli chcesz zmanipulować
project.pbxproj
plik, jest to dobrze udokumentowana lista stylów Next. Możesz użyć,plistbuddy
który jest zgodny z tym starym formatem. Możesz także używaćawk
z większą liczbą skryptów, jeśli masz bardziej złożone manipulacje.Jeśli rozumiem twój przypadek użycia, możesz napisać skrypt, który otrzyma najwyższe numery wersji,
awk
a następnie zaktualizuje wszystkie niższe numery wersji, które może znaleźć w plikused
.źródło
PlistBuddy
wydaje się działać dobrze, ale kiedy używamset
polecenia, cały projekt.pbxproj zostaje przekonwertowany na plik XML .plist i nie może być już odczytany przez Xcode. przykład:PlistBuddy -c "Set :objects:$configurationId:buildSettings:CURRENT_PROJECT_VERSION $newProjectVersion" "$projectFile"
pbxproj
plik, anuluje kompilację. Obawiam się, że to tak naprawdę nie zadziała.