Używałem skryptu powłoki jako części mojego procesu kompilacji Xcode w celu zwiększenia numeru kompilacji w pliku plist , jednak często powoduje to awarię Xcode 4.2.1 (z błędem dotyczącym celu nie należącego do projektu; zgaduję zmiana pliku plist w pewien sposób wprowadza w błąd Xcode).
Skrypt powłoki zrobił to tak, że numer kompilacji jest zwiększany tylko agvtool
wtedy, gdy plik jest nowszy niż plik plist (więc samo zbudowanie nie zwiększyło wartości):
if [ -n \"`find ProjDir -newer ProjDir/Project-Info.plist`\" ]; then agvtool -noscm next-version -all; else echo \"Version not incremented\"; fi
Czy istnieje sposób na zwiększenie numeru kompilacji (w pliku plist lub gdziekolwiek indziej), który nie zepsuje Xcode?
EDYCJA KOŃCOWA : Teraz robię tego rodzaju rzeczy za pomocą skryptu Pythona, który właśnie opublikowałem na githubie . Nie jest to dobrze udokumentowane, ale nie powinno być trudne do rozwiązania. Jako bonus, to repozytorium zawiera również przydatny skrypt do automatycznego łączenia biblioteki innej firmy w pakiet aplikacji.
Odpowiedzi:
Jeśli dobrze rozumiem Twoje pytanie, chcesz zmodyfikować
Project-Info.plist
plik, który jest częścią standardowego szablonu projektu Xcode?Powodem, dla którego o to pytam, jest to, że
Project-Info.plist
normalnie znajduje się pod kontrolą wersji, a modyfikacja oznacza, że zostanie oznaczona jako, no cóż, zmodyfikowana.Jeśli to nie przeszkadza, następujący fragment kodu zaktualizuje numer kompilacji i oznaczy plik jako zmodyfikowany w procesie, gdzie
get_build_number
jest jakiś skrypt (tj. Symbol zastępczy w tym przykładzie), aby uzyskać (prawdopodobnie zwiększony) numer kompilacji, który chcesz użyć:PlistBuddy pozwala ustawić dowolny klucz w pliku plist, nie tylko numer wersji. Możesz utworzyć wszystkie potrzebne pliki plist i w razie potrzeby dołączyć je do zasobów. Następnie można je wczytać z pakietu.
Jeśli chodzi o potrzebę pokazania wersji w okienku informacji i innych miejscach, możesz również zajrzeć do ustawień
CFBundleGetInfoString
iCFBundleShortVersionString
.źródło
agvtool
), jednak akt modyfikowania pliku plist podczas kompilacji często psuje Xcode (od usunięcia skryptu nie ma ' awaria raz, gdy ulegała awarii co około 3 kompilacje). Czy można umieścić informacje o wersji w innym pliku plist i dołączyć je do pakietu i uzyskać do nich dostęp z poziomu aplikacji?get_build_number
to tylko symbol zastępczy - zaktualizowano odpowiedź w celu wyjaśnienia.Grzebałem w wielu odpowiedziach na to pytanie i żadna z nich nie zadowoliła mnie. Jednak w końcu wymyśliłem mieszankę, którą naprawdę lubię!
Istnieją dwa kroki, jeden na początku i jeden na końcu faz budowy.
Na początku:
Na końcu:
Patrząc na Info.plist w Xcode, zobaczysz, że numer wersji to „ROZWÓJ”, ale zbudowana aplikacja będzie miała stale rosnący numer wersji. (O ile zawsze budujesz konstrukcje z tej samej gałęzi).
Ustawienie numeru wersji z powrotem na stały ciąg na końcu zapobiega zmianie pliku Info.plist przez zbudowanie aplikacji.
Dlaczego podoba mi się ta metoda:
źródło
git rev-list --count HEAD
zamiastgit rev-list HEAD | wc -l | tr -d ' '
.fastlane
do przesyłania automatycznych kompilacji w ten sposób, otrzymujesz: BŁĄD ITMS-90058: "Ten pakiet jest nieprawidłowy. Wartość klucza CFBundleVersion [DEVELOPMENT] w pliku Info.plist musi być rozdzieloną kropkami listą at większość trzech nieujemnych liczb całkowitych. "Użyłem tego glisty. Działa zgodnie z oczekiwaniami. https://gist.github.com/sekati/3172554 (wszystkie zasługi należą do oryginalnego autora)
Skrypty, które z czasem modyfikowałem.
xcode-versionString-generator.sh ,
xcode-build-number-generator.sh
Ponieważ te treści pomagają społeczności deweloperów, stworzyłem z tego projekt GitHub. Rozwińmy więc to dobrze. Oto projekt GitHub: https://github.com/alokc83/Xcode-build-and-version-generator
Zaktualizowałem kod dla obu skryptów, nieco ulepszając. zamiast używać poniższego, pobierz najnowsze z GitHub
Wersja:
Do budowy:
źródło
Cały ten wpis był niezwykle pomocny. Użyłem tej sztuczki, ale skonfigurowałem mój skrypt jako punkt zaczepienia po zatwierdzeniu w GIT, więc wartość CFBundleVersion jest zwiększana po każdym udanym zatwierdzeniu. Skrypt przechwytujący trafia do .git / hooks. Dziennik pozostaje w katalogu projektu.
To spełnia moje najbardziej podstawowe kryterium. Chcę móc pobrać wersję z GIT i odbudować dokładnie taką wersję, jaką miałem wcześniej. Żadna inkrementacja wykonana podczas procesu budowania tego nie robi.
Oto mój skrypt:
źródło
bump_build_number.sh
skrypcie od czasu jego powstania.Nie wiem, która droga jest najlepsza, ale opublikuję odpowiedź Apple na wypadek, gdyby ktoś jej szukał ...
Zgodnie z tym postem z pytaniami i odpowiedziami firmy Apple :
Automatyzacja numerów wersji i kompilacji za pomocą agvtool
Klucze wersji i numeru kompilacji określają odpowiednio marketingową i wewnętrzną wersję aplikacji. agvtool to narzędzie wiersza poleceń, które umożliwia automatyczne zwiększanie tych liczb do kolejnej największej liczby lub do określonej liczby.
Numer kompilacji wskazuje niewydaną lub wydaną wersję aplikacji. Jest przechowywany w Info.plist aplikacji jako
CFBundleVersion
(Wersja pakietu).W projekcie Xcode musisz wykonać następujące kroki:
Przejdź do okienka Ustawienia kompilacji celu, a następnie zaktualizuj go dla wszystkich konfiguracji kompilacji w następujący sposób:
Plik danych projektu Xcode, project.pbxproj, zawiera
CURRENT_PROJECT_VERSION
ustawienie kompilacji (bieżąca wersja projektu), które określa bieżącą wersję projektu. agvtool wyszukuje plik project.pbxprojCURRENT_PROJECT_VERSION
. Kontynuuje działanie, jeśliCURRENT_PROJECT_VERSION
istnieje, i przestaje działać, w przeciwnym razie. Jego wartość służy do aktualizacji numeru kompilacji.Domyślnie Xcode nie używa żadnego systemu wersjonowania. Ustawienie systemu obsługi wersji na Apple Generic gwarantuje, że Xcode będzie zawierał wszystkie informacje o wersji wygenerowane przez agvtool w projekcie.
agvtool przeszukuje Info.plist twojej aplikacji pod kątem twojej wersji i numeru kompilacji. Aktualizuje je, jeśli istnieją, i nic nie robi, w przeciwnym razie. Upewnij się, że klucze
CFBundleVersion
(Wersja pakietu) iCFBundleShortVersionString
( Wersja pakietu, krótkie) istnieją w Info.plist, jak widać na poniższym obrazku:Zamknij Xcode, a następnie przejdź do katalogu zawierającego plik projektu .xcodeproj w aplikacji Terminal przed uruchomieniem któregokolwiek z poniższych poleceń. Plik projektu .xcodeproj zawiera project.pbxproj, który jest używany przez agvtool. (Jest to część, którą można uruchomić w skrypcie zamiast w wierszu poleceń).
Aktualizacja numeru wersji
Aby zaktualizować numer wersji do określonej wersji, uruchom
Np .: Zaktualizuj numer wersji do 2.0
Aktualizacja numeru kompilacji
Aby automatycznie zwiększyć numer kompilacji, uruchom
Aby ustawić numer kompilacji aplikacji na określoną wersję, uruchom
Przykład: ustaw numer kompilacji na 2.6.9
Premia:
Aby wyświetlić aktualny numer wersji, uruchom
Aby wyświetlić aktualny numer kompilacji, uruchom
źródło
FWIW - to jest to, czego obecnie używam, aby zwiększyć numer kompilacji tylko dla wersji wydania (co obejmuje archiwizację). Działa dobrze pod Xcode 5.1.
Po prostu skopiuj / wklej fragment kodu do fazy budowania skryptu Uruchom bezpośrednio w Xcode:
źródło
Dzięki za scenariusz. Działa świetnie.
Moja Info.plist znajduje się w podkatalogu o nazwie zawierającej spacje, więc musiałem zmodyfikować skrypt uruchamiania za pomocą cudzysłowów wokół ścieżki plist:
i skrypt powłoki w ten sam sposób z cudzysłowami wokół wszystkich ścieżek:
źródło
Skrypt, którego obecnie używam, jest bardzo oparty na skrypcie Alix powyższym . Moja adaptacja, poniżej, dodaje sprawdzenie, aby wykonać automatyczną inkrementację tylko w kompilacji wydania / archiwum.
Bez tej zmiany wystąpią konflikty kontroli wersji, ponieważ każdy programista będzie zwiększał numer kompilacji we własnym tempie. I fakt, że historia gita byłaby niepotrzebnie zanieczyszczona przez cały czas zmieniający się numer kompilacji.
Jest również dostępny (w nieco łatwiejszym do skopiowania i wklejania formacie) jako treść GitHub .
źródło
Poleciłbym korzystanie z autorewizji .
Xcode pozwala na plik nagłówkowy (który może być generowany automatycznie w czasie kompilacji, a nie w samym pliku vcs) na dostarczanie wartości, które zostaną rozwinięte w info.plist podczas kompilacji. Przewodnik, jak to zrobić, znajdziesz na stronie autorewizji .
Autorevision ma typ wyjścia dostosowany do plików nagłówkowych tego typu, aby pomóc w dokładnie takich sytuacjach.
źródło
Autorevision
nie wydaje się zmieniać numeru kompilacji, zgodnie z wymaganiami?VCS_NUM
powinno być tym, czego szukasz ( zobaczautorevision.h
przykład ).Jednym z problemów z niektórymi z tych rozwiązań jest to, że Launch Services rozpoznaje tylko
czterypięć głównych cyfr w wersji pakietu . Mam projekt z numerem kompilacji w tysiącach, więc chciałem użyć mniej znaczących cyfr.Ten skrypt Perla inkrementuje wszystkie listy Info.plist w projekcie, a nie tylko ten dla bieżącego celu, więc wszystkie numery kompilacji pozostają nierozłączne. Używa również jednej cyfry poprawki i dwóch mniejszych cyfr, więc kompilacja 1234 ma wersję 1.23.4. Używam go jako zachowania przed kompilacją, więc dotyczy wszystkich projektów, które buduję.
Scenariusz jest dość brutalny, ale dla mnie działa.
źródło
Możesz użyć generycznej wersji Apple . Zasadniczo wszystko, co musisz zrobić, to zadzwonić
agvtool next-version -all
z katalogu, w którym znajduje się plik .xcproj. Aby uzyskać więcej informacji, sprawdź powyższy adres URL.źródło
Opierając się na rozwiązaniu Wil Gieselera , miałem tylko jedną zmianę, którą chciałem wprowadzić. Jego rozwiązanie umieszcza liczbę zatwierdzeń git w numerze kompilacji. Przydatne, ale wciąż trochę uciążliwe, aby znaleźć rzeczywiste zmiany, które stworzyły tę kompilację. Nie obchodziło mnie zbytnio, czy numer kompilacji rośnie monotonicznie, więc zrezygnowałem z tego wymagania, aby łatwiej uzyskać dostęp do zatwierdzenia, które wygenerowało dany plik binarny.
W tym celu zmodyfikowałem jego pierwszy skrypt do następującego:
To konwertuje krótką wersję bieżącego git SHA na dziesiętną. Znaki szesnastkowe nie działają dobrze z wymaganiami dotyczącymi numeru kompilacji Apple, dlatego musiałem to zrobić. Aby go przekonwertować, po prostu uruchomisz coś takiego:
w bash, gdzie
<build number>
jest numer kompilacji uzyskany z pliku binarnego. Następnie po prostu biegnijgit checkout $SHA
i gotowe.Ponieważ jest to adaptacja rozwiązania Wil Gieselera , jak wspomniano powyżej, będziesz również potrzebować następującego skryptu po kompilacji:
dzięki czemu Twoja historia git jest czysta.
źródło
Info.plist
, które są śledzone przez git?Wypróbowałem zmodyfikowaną procedurę i nie zadziałała, ponieważ: -
Xcode 4.2.1 zmienia podkatalog xcuserdata w .xcodeproj
git zauważa poprzednią zmianę w Project-Info.plist
Następująca modyfikacja powoduje, że są one ignorowane i sygnalizuje tylko prawdziwe zmiany: -
źródło
Możesz to zrobić tylko wtedy, gdy archiwizujesz (i na przykład przesyłasz do TF). W przeciwnym razie numer Twojej wersji może wzrosnąć naprawdę szybko.
W schemacie (Produkt / Edycja schematu / Archiwum / Działania wstępne) możesz dodać skrypt, który będzie wykonywany tylko podczas archiwizacji.
Możesz też chcieć zresetować numer kompilacji za każdym razem, gdy zwiększasz wersję aplikacji.
Ostatnia rzecz, jeśli zamiast tego używasz archiwum, możesz bezpiecznie wyłączyć:
Ponieważ numer kompilacji zostanie zwiększony tylko podczas archiwizacji ...
EDYCJA: Popraw to, co powiedziałem, działania wstępne w archiwum mają miejsce po kompilacji (ale przed archiwizacją), więc numer kompilacji będzie zwiększany dla następnego archiwum ... Ale możesz utworzyć nowy schemat i dodać tę akcję w kompilacji (przed czynności) tego nowego schematu. i użyj tego schematu, gdy chcesz utworzyć nową kompilację
źródło
Używam ostatniej wersji SVN jako numeru kompilacji. Jeśli zmienisz Info.plist w katalogu kompilacji, nie wpłyniesz na źródło Info.plist:
źródło
Czuję, że znalazłem swoje plemię. Plemię, mam nadzieję, że VersionX cię bawi.
Dziesięć lat temu, pracując nad obszarem roboczym, w którym znajdowało się ponad 25 projektów Xcode, skorzystałem z okazji, aby zautomatyzować wersję i zbudować aktualizacje ciągów w stopniu, który może wydawać się absurdalny, jeśli utrzymujesz tylko jeden lub dwa projekty z okazjonalnymi aktualizacjami.
WersjaX:
Fajnie było zrobić. Dowiedziałem się dużo o systemie kompilacji Xcode.
Oto przykład typu fantazyjnych ciągów wersji i kompilacji, które VersionX może wygenerować automatycznie.
WersjaX 1.0.1 β7 (c5959a3 „Wyczyść”)
Wersja marketingowa: WersjaX 1.0.1 β7 „1.0.1 pochodzi ze znacznika zatwierdzenia, podczas gdy„ Beta 7 ”jest automatycznie generowana przez liczbę zatwierdzeń lub liczbę kompilacji (na przykład).
Wersja kompilacji: (c5959a3 „Wyczyść”) Wyświetla skrót skrótu zatwierdzenia i informuje, że w katalogu kompilacji nie było żadnych niezatwierdzonych zmian.
VersionX (źródło w GitHub) - barokowy system do automatycznego zwiększania wersji i tworzenia ciągów znaków w projektach Xcode.
Dokumentacja VersionX.
źródło
Możesz sprawdzić nowe narzędzie, które opracowałem, o nazwie Xcodebump. Może obsługiwać aktualizację zarówno CFBundleShortVersionString, jak i CFBundleVersion. Ostatnim krokiem będzie również sprawdzenie git i oznaczenie commit w celu dopasowania do tych wartości CFBundle.
Projekt Xcodebump znajduje się tutaj:
https://github.com/markeissler/Xcodebump
źródło
Aktualizuję
build number
następującą metodą.$INFO_FILE
to ścieżka do pliku plist. A$build_number
to nowy numer kompilacji dla tego budynku.Ogólnie mój
$build_number
składa się z częścimajor
iminor
.minor
Jest pochodzą z informacji o projekcie. Więc opisuję, jak wygenerowaćmajor
część.Mam dwie strategie, aby zdecydować
$build_number
.Pierwsza strategia
Ta strategia używa
git tag
liczby do decydowaniamajor
obuild number
. Jeśli istnieją53
tagi projektu, zwróci on,53
wykonując następujący skrypt powłoki.Ogólnie rzecz biorąc, rośnie. I zmusi programistę do umieszczenia tagu git przed publikacją.
Druga strategia
Niech system CI Jenkinsa zdecyduje o
major
części. Ma zmienną środowiskowąBUILD_NUMBER
. Zwiększa się automatycznie podczas tworzenia systemu CI. Te informacje są przydatne do śledzenia historii projektu w systemie CI.źródło
Oto zaktualizowana wersja. Działa od Xcode 9.3.1, iOS 11.
Kliknij „Fazy budowania” w miejscu docelowym aplikacji, kliknij ikonę +, aby dodać nowy skrypt uruchamiania, a następnie w polu wklej ten kod.
Przejdź do pliku Info.plist i ustaw „Wersja pakietu” na 1, a „Łańcuch wersji pakietu, krótkie” na 1, powinno być ustawione.
Zbuduj projekt z podglądem Info.plist i powinieneś zobaczyć zmianę wersji pakietu (numer kompilacji).
źródło
Oto moje rozwiązanie. Jeśli jesteś podobny do mnie: przyjazny terminalowi, jak ruby, jak wersjonowanie semantyczne, spróbuj tego.
Utwórz plik o nazwie,
Rakefile
który zawiera to:Przygotować:
gem install xcodeproj versionomy
Run:
rake increment:major
czyrake increment:minor
lubrake increment:tiny
kiedy chcesz.źródło
Uważam, że najwygodniejsze jest użycie automatyzacji wersji i numerów kompilacji za pomocą agvtool .
Spróbuj tego:
<your_app_target>
Skrypt (pierwsza linia jest opcjonalna):
źródło
Zróbmy to na swój sposób Apple. Zwiększy numer kompilacji po każdej udanej kompilacji
Poprowadzę Cię przez 5 obrazów, po prostu je przejrzyj.
Wybierz „Edytuj schemat ...” z menu rozwijanego, po wybraniu nazwy projektu znajdującej się po prawej stronie przycisku Stop_build_button. Sprawdź pierwszy krok
Z menu po lewej stronie rozwiń opcję „Buduj” i wybierz „Działania po wykonaniu” Sprawdź drugi krok
Tutaj możesz dodać żądane kody (skrypty), które chcesz wykonać po udanej kompilacji programu. Jest to miejsce, w którym musimy dodać trochę kodu, aby nasza automatyzacja działała idealnie. >> 1. wybierz przycisk 'dodaj (+)' z lewego rogu, aby dodać nowy plik skryptu >> 2. Teraz z listy rozwijanej wybierz 'Nowa akcja skryptu uruchamiania' Sprawdź trzeci krok
Zawiera 3 pola >> 1. powłoka jest już przypisana do ciebie >> 2. teraz dla „Podaj ustawienia budowania z” Wybierz nazwę projektu. >> 3. Tam jest duże pole do dodania skryptu, po prostu skopiuj i wklej tam ten kod: Sprawdź czwarty krok
PLIST = "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}" PLB = / usr / libexec / PlistBuddy LAST_NUMBER = $ ($ PLB -c "Print CFBundleVersion" "$ PLIST") NEW_VERSION = $ (($ LAST_NUMBER + 1)) $ PLB -c "Zestaw: CFBundleVersion $ NEW_VERSION" "$ PLIST"
Po wykonaniu czwartego kroku po prostu wybierz „Zamknij”, aby zamknąć okno i musimy zrobić ostatni krok, przejdź do pliku „plist.info” w menu Plik projektu i upewnij się, że klucz „Wersja pakietu” w sekcji „Klucz” zawiera najwięcej Piąty krok sprawdzania wartości liczbowych
źródło