Lepszy sposób zwiększania liczby kompilacji?

Używałem skryptu powłoki w ramach mojego procesu budowania Xcode, aby zwiększyć numer kompilacji w pliku plist, jednak powoduje to, że Xcode 4.2.1 często się zawiesza(z błędem dotyczącym celu, który nie należy do projektu; zgaduję, że zmiana pliku plist jest myląca Xcode w jakiś sposób).

Skrypt powłoki zrobił to tak, że numer kompilacji jest zwiększany tylko o agvtool, gdy plik jest nowszy niż plik plist (więc po prostu budowanie nie zwiększył 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 łamie Xcode?

EDIT: Oto moje ostateczne rozwiązanie, oparte na sugestii @Monolo. Stworzyłem następujący skrypt w ${PROJECT_DIR}/tools (w katalogu .xcodeproj):

#!/bin/sh

if [ $# -ne 1 ]; then
    echo usage: $0 plist-file
    exit 1
fi

plist="$1"
dir="$(dirname "$plist")"

# Only increment the build number if source files have changed
if [ -n "$(find "$dir" \! -path "*xcuserdata*" \! -path "*.git" -newer "$plist")" ]; then
    buildnum=$(/usr/libexec/Plistbuddy -c "Print CFBundleVersion" "$plist")
    if [ -z "$buildnum" ]; then
        echo "No build number in $plist"
        exit 2
    fi
    buildnum=$(expr $buildnum + 1)
    /usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnum" "$plist"
    echo "Incremented build number to $buildnum"
else
    echo "Not incrementing build number as source files have not changed"
fi

EDIT 2 : zmodyfikowałem skrypt tak, aby uwzględniał sugestię @ Milliways.

Następnie wywołałem skrypt z Xcode target Sekcja "fazy budowania": Fazy budowania Xcode zrzut ekranu

EDIT 3: zgodnie z odpowiedzią @massimobio, musisz dodać cudzysłowy wokół argumentu plist, jeśli zawiera spacje.

EDIT 4: aby zaktualizować, moją preferowaną metodą wywoływania tego skryptu kompilacji jest teraz utworzenie osobnego celu i uzależnienie celu aplikacji od tego celu Bump Build Number. To zapewnia, że jest wywoływany zanim cel aplikacji zrobi cokolwiek {[9] } z plist (zauważyłem, że lubi przetwarzać plist na początku kompilacji). Przełączyłem się również na rozwiązanie czysto pythonowe, które przechowuje numer wersji w osobnym pliku i zapisuje pliki źródłowe wersji, ponieważ jest to bardziej przydatne dla produktów wieloplatformowych(np. Visual Studio pod Windows może wywołać skrypt, i oczywiście CMake / make-type builds może to zrobić również). Ma to tę zaletę, że numer kompilacji jest zawsze taki sam, nawet pod różnymi platformami, a także możliwe jest zaktualizowanie wizualizacji Studio Resource.rc Plik z aktualną wersją / build.

Tutaj {[46] } jest skrypt Pythona, którego obecnie używam do aktualizacji Info.plist plików w projekcie Xcode.

Author: Community, 2012-02-13

20 answers

Jeśli dobrze rozumiem twoje pytanie, chcesz zmodyfikować plik Project-Info.plist, który jest częścią standardowego szablonu projektu Xcode?

Powodem, dla którego pytam jest to, że Project-Info.plist Normalnie jest pod kontrolą wersji, a modyfikacja oznacza, że będzie oznaczona jako, no cóż, zmodyfikowana.

Jeśli nie masz nic przeciwko, to poniższy fragment zaktualizuje numer kompilacji i oznacz plik jako zmodyfikowany w procesie, gdzie get_build_number jest jakimś skryptem (np. symbolem zastępczym w tym przykładzie) do uzyskaj (ewentualnie zwiększony) numer kompilacji, którego chcesz użyć:

#!/bin/sh

# get_build_number is a placeholder for your script to get the latest build number
build_number = `get_build_number`

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion ${build_number}" ProjDir/Project-Info.plist

PlistBuddy pozwala ustawić dowolny klucz w pliku plist, nie tylko numer wersji. Możesz utworzyć wszystkie pliki plist, które chcesz, i włączyć je do zasobów w razie potrzeby. Następnie można je odczytać z pakietu.

Jeśli chodzi o potrzebę wyświetlania wersji w panelu informacje i innych miejscach, możesz również zajrzeć do ustawień CFBundleGetInfoString i CFBundleShortVersionString.

 29
Author: Monolo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-15 12:13:31

Wygłupiałem się z wieloma odpowiedziami na to pytanie i żadna z nich mnie nie zadowoliła. Jednak w końcu wymyśliłam mieszankę, która naprawdę mi się podoba!

Istnieją dwa etapy, jeden na początku i jeden na końcu fazy budowania.

Na początku:

# Set the build number to the count of Git commits
buildNumber=$(git rev-list HEAD | wc -l | tr -d ' ')
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Na końcu:

# Set the build number to "DEVELOPMENT"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion DEVELOPMENT" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Patrząc na Info.plist w Xcode zobaczysz numer wersji jest "rozwój", ale zbudowany aplikacja będzie mieć stale rosnący numer kompilacji. (Tak długo jak zawsze robisz swoje budowle z tej samej gałęzi.)

Ustawienie numeru wersji z powrotem na stały ciąg znaków na końcu uniemożliwia podanie informacji.plik plist od zmiany przez budowanie aplikacji.

Dlaczego lubię tę metodę:

  • Easy
  • nie zanieczyszcza historii wersji Git
  • CFBundleVersion jest całkowicie automatyczny
  • ładny numer wersji może być modyfikowany kiedy tylko chcę
 68
Author: Wil Gieseler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-15 05:24:45

Użyłem tego błysku jego niesamowite i działa zgodnie z oczekiwaniami. https://gist.github.com/sekati/3172554 (wszystkie podziękowania należą się autorowi oryginału)

Sctipts, które z czasem zmodyfikowałem.

Xcode-versionString-generator.sh ,

Xcode-build-number-generator.sh

Ponieważ te gist pomagają społeczności deweloperów. Myślałem, że zrobię z tego projekt github. Więc rozwijamy go dobrze. Oto github projekt: https://github.com/alokc83/Xcode-build-and-version-generator

Zaktualizowałem kod dla obu skryptów trochę ulepszenia. zamiast używać poniżej pobierz najnowszą wersję z github

Dla Wersji:

# xcode-version-bump.sh
# @desc Auto-increment the version number (only) when a project is archived for export. 
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below in to new "Run Script" section
# 5. Check the checkbox "Run script only when installing"
# 6. Drag the "Run Script" below "Link Binaries With Libraries"
# 7. Insure your starting version number is in SemVer format (e.g. 1.0.0)

# This splits a two-decimal version string, such as "0.45.123", allowing us to increment the third position.
VERSIONNUM=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}")
NEWSUBVERSION=`echo $VERSIONNUM | awk -F "." '{print $3}'`
NEWSUBVERSION=$(($NEWSUBVERSION + 1))
NEWVERSIONSTRING=`echo $VERSIONNUM | awk -F "." '{print $1 "." $2 ".'$NEWSUBVERSION'" }'`
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $NEWVERSIONSTRING" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Dla budowy:

# xcode-build-bump.sh
# @desc Auto-increment the build number every time the project is run. 
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below in to new "Run Script" section
# 5. Drag the "Run Script" below "Link Binaries With Libraries"
# 6. Insure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
 36
Author: Alix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-01 13:58:36

Ten cały wpis był niezwykle pomocny. Użyłem tej sztuczki, ale skonfigurowałem mój skrypt jako hook po zatwierdzeniu w GIT, więc CFBundleVersion jest zwiększany po każdym zatwierdzeniu. Wchodzi skrypt hook .git / hooks. W katalogu projektu pozostaje dziennik.

To spełnia moje najbardziej podstawowe kryterium. Chcę być w stanie wyciągnąć wersję z Gita i odbudować dokładną kompilację, którą miałem wcześniej. Żaden przyrost dokonany podczas procesu budowania tego nie robi.

Oto mój skrypt:

#!/bin/sh
#
# post-commit
#
# This script increments the CFBundleVersion for each successful commit
#

plist="./XYZZY/XYZZY-Info.plist"
buildnum=$(/usr/libexec/Plistbuddy -c "Print CFBundleVersion" "$plist")
if [ -z "$buildnum" ]; then
    exit 1
fi
buildnumplus=$(expr $buildnum + 1)
/usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnumplus" "$plist"

echo $(date) "- Incremented CFBundleVersion to" $buildnumplus >> hookLog.txt
 14
Author: LostInTheTrees,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-07 17:38:57

Nie wiem, która droga jest najlepsza, ale wrzucę odpowiedź Apple na wypadek, gdyby ktoś jej szukał...

Zgodnie z tym Apple ' s q&a post:

Automatyzacja numerów wersji i kompilacji za pomocą agvtool

Klucze wersji i numeru kompilacji określają odpowiednio wersje marketingowe i wewnętrzne aplikacji. agvtool to narzędzie wiersza poleceń, które pozwala na automatyczne zwiększanie tych liczb do następnej największej liczby lub do określonego numeru.

Numer kompilacji identyfikuje niepublikowaną lub wydaną wersję aplikacji. Jest on przechowywany w informacji o aplikacji.plist jako CFBundleVersion (wersja w pakiecie).

Musisz wykonać następujące kroki w projekcie Xcode:

  1. Włącz agvtool

Przejdź do panelu ustawień kompilacji celu, a następnie zaktualizuj go dla wszystkich konfiguracji kompilacji w następujący sposób:

  • Ustaw bieżącą wersję projektu na wartość, którą wybierzesz.

Twój plik danych projektu Xcode, project.pbxproj, zawiera CURRENT_PROJECT_VERSION (Current project Version) ustawienie budowania, które określa bieżącą wersję projektu. projekt wyszukiwania agvtool.pbxproj dla CURRENT_PROJECT_VERSION. Kontynuuje działanie, Jeśli CURRENT_PROJECT_VERSION istnieje i przestaje działać, w przeciwnym razie. Jego wartość jest używana do aktualizacji numeru kompilacji.

  • Ustaw System wersjonowania Na Apple Generic.

Domyślnie Xcode nie używa żadnego systemu wersjonowania. Ustawienie System wersjonowania do Apple Generic zapewnia, że Xcode będzie zawierać wszystkie informacje o wersji Wygenerowanej Przez agvtool w projekcie.

Ustaw system wersjonowania Na Apple Generic

  1. skonfiguruj swoją wersję i zbuduj numery

Agvtool przeszukuje dane twojej aplikacji.plist dla wersji i buduj numery. Aktualizuje je, jeśli istnieją i nie robi nic, w przeciwnym razie. Upewnij się, że klucze CFBundleVersion (Bundle version) i CFBundleShortVersionString (Bundle version string, short) istnieją w Twoim Info.plist jak widać na poniższym obrazku:

Skonfiguruj swoją wersję i buduj numery

Zamknij Xcode, a następnie przejdź do katalogu zawierającego Twoje .plik projektu XCODEPROJ w aplikacji terminalowej przed uruchomieniem któregokolwiek z poniższych poleceń. The .plik projektu XCODEPROJ zawiera projekt.pbxproj, który jest używany przez agvtool. (Jest to część, którą można uruchomić w skrypcie zamiast wiersza poleceń.)

Aktualizacja numeru wersji

Aby zaktualizować numer wersji do określonego wersja, run

xcrun agvtool new-marketing-version <your_specific_version>

Ex: zaktualizuj numer wersji do 2.0

xcrun agvtool new-marketing-version 2.0

Aktualizacja numeru budowy

Aby automatycznie zwiększyć numer kompilacji, Uruchom

xcrun agvtool next-version -all

Aby ustawić numer kompilacji aplikacji na konkretną wersję, Uruchom

xcrun agvtool new-version -all <your_specific_version>

Ex: Ustaw numer kompilacji na 2.6.9

xcrun agvtool new-version -all 2.6.9

Bonus:

Aby wyświetlić bieżący numer wersji, uruchom

xcrun agvtool what-marketing-version

Aby wyświetlić bieżący build numer, run

xcrun agvtool what-version
 12
Author: FormigaNinja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-25 02:35:49

FWIW-to jest to, czego obecnie używam, aby zwiększyć numer kompilacji tylko dla wersji kompilacji (która obejmuje archiwizację). Działa dobrze pod Xcode 5.1.

Po prostu skopiuj / wklej fragment do Uruchom skrypt Faza budowania bezpośrednio w Xcode:

buildnum=$(/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$PRODUCT_SETTINGS_PATH")

if [ "$CONFIGURATION" = "Release" ]; then
buildnum=$((buildnum + 1))
echo "Build number updated to $buildnum"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildnum" "$PRODUCT_SETTINGS_PATH"
fi;
 11
Author: Jay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-31 20:15:01

Dzięki za scenariusz. Działa świetnie.

Moje Info.plist jest w podkatalogu o nazwie zawierającej spacje, więc musiałem zmodyfikować skrypt z cudzysłowami wokół ścieżki plist:
${PROJECT_DIR}/tools/bump_build_number.sh "${PROJECT_DIR}/${INFOPLIST_FILE}"

I skrypt powłoki w ten sam sposób z cudzysłowami wokół wszystkich ścieżek:

#!/bin/sh

if [ $# -ne 1 ]; then
    echo usage: $0 plist-file
    exit 1
fi

plist=$1
dir=$(dirname "$plist")

# Only increment the build number if source files have changed
if [ -n "$(find "$dir" \! -path "*xcuserdata*" \! -path "*.git" -newer "$plist")" ]; then
    buildnum=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$plist")
    if [ -z "$buildnum" ]; then
        echo "No build number in $plist"
        exit 2
    fi
    buildnum=$(expr $buildnum + 1)
    /usr/libexec/Plistbuddy -c "Set CFBundleVersion $buildnum" "$plist"
    echo "Incremented build number to $buildnum"
else
    echo "Not incrementing build number as source files have not changed"
fi
 6
Author: massimobio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-02 23:19:57

Skrypt, którego obecnie używam, jest w dużej mierze oparty na Alixa, powyżej. Moja adaptacja, poniżej, dodaje sprawdzenie tylko zrobić auto-przyrost na kompilacji wydania / archiwum.

Bez tej zmiany pojawią się konflikty kontroli wersji, ponieważ każdy programista będzie zwiększał liczbę kompilacji w swoim własnym tempie. I fakt, że historia Gita byłaby niepotrzebnie zanieczyszczona z numerem kompilacji zmieniającym się cały czas.

# xcode-build-bump.sh
# @desc Auto-increment Xcode target build number every time the project is archived
# @src stackoverflow.com/a/15483906
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below in to new "Run Script" section
# 5. Drag the "Run Script" below "Link Binaries With Libraries"
# 6. Insure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)

if [ "Release" != "${CONFIGURATION}" ]
then
    exit 0
fi

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Jest również dostępny (w nieco łatwiejszym do format kopiowania i wklejania) jako GitHub gist .

 6
Author: Matthew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:26

Polecam użycie autorevision .

Xcode pozwala plikowi nagłówkowemu (który może być automatycznie generowany w czasie kompilacji, a nie w samym vcs) dostarczyć wartości, które zostaną rozszerzone w info.plist w czasie budowy. Możesz znaleźć sposób na skonfigurowanie tego na stronie autorevision.

Autorevision ma typ wyjściowy nastawiony na pliki nagłówkowe tego typu, aby pomóc dokładnie w tych sytuacjach.

 5
Author: dak180,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-16 17:38:06

Problem z niektórymi z tych rozwiązań polega na tym, że usługi uruchamiania rozpoznają tylko Cztery pięć głównych cyfr w wersji pakietu . Mam projekt z numerem kompilacji, który jest w tysiącach, więc chciałem użyć niektórych mniej znaczących cyfr.

Ten skrypt Perla zwiększa wszystkie informacje.plisty w projekcie, a nie tylko ten dla bieżącego celu, więc numery kompilacji pozostają w lockstep. Używa również jednej cyfry łatki i dwóch cyfr podrzędnych, więc build 1234 otrzymuje wersja 1.23.4. Używam go jako zachowania pre-build, więc odnosi się do wszystkich projektów, które buduję.

Scenariusz jest dość brutalny, ale działa na mnie.

#!/usr/bin/perl

use strict;
use warnings;
use v5.12.0;

use Dir::Iterate;

for my $plist_file(grepdir { /-Info.plist$/ } '.') {
    my $build = `/usr/libexec/PlistBuddy -c "Print CFBundleVersion" '$plist_file'`;
    chomp $build;

    next unless $build;

    # Strip dots
    $build =~ s/\.//g;
    $build =~ s/^0//g;

    # Increment
    $build++;

    # Re-insert dots
    $build =~ s/^(\d{0,4}?) (\d{0,2}?) (\d{0,1}?)$/$1.$2.$3/x;

    # Insert zeroes
    $build =~ s{(^|\.)\.}{${1}0.}g;

    system qq(/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build" '$plist_file');
}
 4
Author: Brent Royal-Gordon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-03 07:15:19

Możesz użyć generycznego wersjonowania Apple . Zasadniczo wszystko, co musisz zrobić, to zadzwonić agvtool next-version -all z katalogu, który hostuje Twoje .plik xcproj. Aby uzyskać więcej informacji, zapoznaj się z powyższym adresem url.

 4
Author: Valentin Radu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-31 17:38:50

Bazując na rozwiązaniu Wila Gieselera, miałem tylko jedną zmianę, którą chciałem wprowadzić. Jego rozwiązanie umieszcza liczbę commitów git w numerze kompilacji. Użyteczne, ale i tak trudno znaleźć faktyczny commit, który stworzył tę konstrukcję. Nie dbałem zbytnio o to, czy liczba kompilacji rośnie monotonicznie, więc porzuciłem to wymaganie, aby łatwiej uzyskać dostęp do commita, który wygenerował dany plik binarny.

W tym celu zmodyfikowałem jego pierwszy skrypt do po:

# Set the build number to the decimal conversion of the short version of the current git SHA

# Get the short version of the current git SHA in hexadecimal
SHA=$(git rev-parse --short @)
# Uppercase any alphabetic chars in SHA (bc doesn't like lowercase hex numbers)
UPPERCASE_SHA=$(tr '[:lower:]' '[:upper:]' <<< "$SHA")
# Use bc to convert the uppercase SHA from hex to decimal
BUILD_NUM=$(bc <<< "ibase=16;obase=A;$UPPERCASE_SHA")
# Set our build number to that
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUM" "${PROJECT_DIR}/${INFOPLIST_FILE}"

# To convert a build number back to a usable git SHA, run the following, substituting the build number for <build number>
# bc <<< "ibase=10;obase=16;<build number>"

To zamienia skróconą wersję bieżącego git SHA na dziesiętną. Znaki szesnastkowe nie grają ładnie z wymaganiami Apple ' a dotyczącymi numeru kompilacji, dlatego musiałem to zrobić. Aby go z powrotem przekonwertować, po prostu uruchom coś takiego:

SHA=$(bc <<< "ibase=10;obase=16;<build number>")

W bash, gdzie <build number> jest numerem kompilacji otrzymanym z pliku binarnego. Potem po prostu biegnij git checkout $SHA, i już.

Ponieważ jest to adaptacja rozwiązania Wil Gieselera , Jak wspomniano powyżej, będziesz potrzebny jest również następujący skrypt post-build:

# Set the build number to "DEVELOPMENT"
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion DEVELOPMENT" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Który utrzymuje twoją historię Gita w czystości.

 3
Author: ravron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:15

Próbowałem zmodyfikowanej procedury i nie zadziałało, ponieważ: -

  1. Xcode 4.2.1 zmienia podkatalog xcuserdata w .xcodeproj

  2. Git odnotowuje poprzednią zmianę w Project-Info.plist

Następująca modyfikacja powoduje, że są one ignorowane i znaczą tylko prawdziwe zmiany: -

if [ -n "$(find $dir \! -path "*xcuserdata*" \! -path "*.git" -newer $plist)" ]; then
 2
Author: Milliways,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-09 05:17:28

Możesz to zrobić tylko wtedy, gdy archiwizujesz (i przesyłasz na przykład do TF). W przeciwnym razie Numer wersji może szybko wzrosnąć..

W scheme (Product / Edit Scheme / Archive / Pre-Actions) możesz dodać skrypt, który będzie wykonywany tylko podczas archiwizacji.

Możesz również 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ć:

# if [ -n "$(find "$dir" \! -path "*xcuserdata*" \! -path "*.git" -newer "$plist")" ]; then
...
# else
    # echo "Not incrementing build number as source files have not changed"
# fi

Jako Budowa liczba zostanie zwiększona tylko wtedy, gdy archiwum ...

EDIT: popraw to, co powiedziałem, wstępne działania w archiwum następują po kompilacji (ale przed archiwizacją), więc numer kompilacji będzie zwiększany do następnego archiwum... Ale możesz utworzyć nowy schemat i dodać tę akcję w sekcji budowania (pre-akcje) tego nowego schematu. i użyj tego schematu, gdy chcesz utworzyć nowy build

 2
Author: Hugues BR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-18 03:31:32

Używam ostatniej wersji SVN dla numeru kompilacji. Jeśli zmienisz informacje.plist w katalogu budowania, nie wpłynie na Informacje źródłowe.plist:

# use the last SVN revision as the build number:
Info_plist="$BUILT_PRODUCTS_DIR/$CONTENTS_FOLDER_PATH/Info.plist"
defaults write "${Info_plist}" CFBundleVersion `svn stat -u | awk '/'"Status against revision:"'/ {print $4}'`
 2
Author: jack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-29 17:44:24

Czuję się jakbym odnalazł swoje plemię. / Align = "left" / Linear

Dziesięć lat temu podczas pracy na obszarze roboczym, który miał ponad 25 projekty Xcode w nim skorzystałem z okazji, aby zautomatyzować wersję i budować aktualizacje ciąg w stopniu, który może wydawać się absurdalne, jeśli jesteś utrzymanie tylko projekt lub dwa z sporadycznych aktualizacji.

VersionX:

  • jest świadomy typu budowania (Release / Debug)
  • gromadzi informacje w czasie budowy z repozytorium (w zestawie wsparcie dla git, ale może być dostosowane do hg, svn lub cokolwiek innego, czego używasz)
  • zapewniono łatwe do dostosowania fantazyjne ciągi wersji marketingowych (które miały znacznie większą zmienność, zanim App Store wprowadził konwencję), dzięki czemu można było automatycznie zwiększać ciągi zawierające symbole dla "beta", na przykład używając konwencji git tag.
  • zawiera klasę wypełnioną zmiennymi instancji zawierającymi informacje o wersji i zatwierdzeniu. Jest to przydatne do wypełniania twój panel O i konstruowanie ciągów logowania, raportów o awariach lub raportów błędów e-mail użytkownika z wstępnie wypełnionymi informacjami.

Fajnie było zrobić. Dowiedziałem się boatload o Xcode build system.

Oto przykład typu fancy Version I build strings VersionX mogą być generowane automatycznie.

VersionX 1.0.1 Beta 7 (c5959a3 "Clean")

Wersja marketingowa: VersionX 1.0.1.7 "1.0.1 pochodzi od tagu commit, while "Beta 7" jest automatycznie generowana przez liczbę zatwierdzeń lub liczbę kompilacji (na przykład).

Wersja budowy: (c5959a3 " Clean") Wyświetla krótki hash commit i informuje, że katalog kompilacji nie zawierał niezatwierdzonych zmian.

VersionX (źródło na GitHub) - barokowy system automatycznego inkrementowania wersji i budowania ciągów w projektach Xcode.

Dokumentacja VersionX.

 2
Author: Gary W. Longsine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-19 16:26:44

Możesz sprawdzić nowe narzędzie, które opracowuję o nazwie Xcodebump. Może obsłużyć aktualizację zarówno Cfbundleshortversion, jak i cfbundleversion. Jako ostatni krok będzie również sprawdzał git i oznaczał commit, aby dopasować się do tych wartości CFBundle.

Projekt Xcodebump znajduje się tutaj:

Https://github.com/markeissler/Xcodebump

 1
Author: markeissler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-24 17:34:32

Aktualizuję build number następującą metodą.

$INFO_FILE jest ścieżką pliku plist. I $build_number jest nowym numerem budowy tego budynku.

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build_number" "${INFO_FILE}"

Ogólnie rzecz biorąc, mój $build_number składa się z major i minor części. {[9] } pochodzi z informacji o projekcie. Opiszę więc jak wygenerować major część.

## Composed by `major` and `minor`. 
## `minor` is parsed from project information. It's another story.
## Examples: `21.1`, or `21.1.3`
build_number="${major_number}.${minor_number}"

Mam 2 strategie, aby zdecydować $build_number.

Pierwsza Strategia

Ta strategia wykorzystuje liczbę git tag do decydowania o major z build number. Jeśli są 53 znaczniki projektu, zwróci {[16] } wykonując skrypt powłoki.

Ogólnie rzecz biorąc, rośnie. I zmusi dewelopera do umieszczenia znacznika git przed publikacją.

major_number=$(git tag -l | wc -l | grep -oE "\d+")

Druga Strategia

Niech Jenkins CI System zdecyduje major część. Posiada zmienną środowiskową BUILD_NUMBER. Zwiększa się automatycznie podczas budowania systemu CI. Informacje te są przydatne do śledzenia historii projektu w systemie CI.

major_number=${BUILD_NUMBER}
 1
Author: AechoLiu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-02 08:25:01

Oto moje rozwiązanie. Jeśli jesteś taki jak ja: terminal friendly, jak ruby, jak wersjonowanie semantyczne, spróbuj tego.

Utwórz plik o nazwie Rakefile, który zawiera:

require "xcodeproj"
require "versionomy"

XCODEPROJECT = "MyProject.xcodeproj"
INFOPLISTFILE = "MyProject/MyProject-Info.plist"

$UPDATES = [:major,:minor,:tiny]
$UPDATES.each { |part|
  desc "increment #{part} part of version"
  task "increment:#{part}" do |task|
    version=`/usr/libexec/Plistbuddy -c "Print CFBundleVersion" #{INFOPLISTFILE}`.chomp
    version=Versionomy.parse(version)
    version=version.bump(part)

    # I use the same string for CFBundleVersion and CFBundleShortVersionString for now
    `/usr/libexec/PlistBuddy -c "Set :CFBundleVersion #{version}" #{INFOPLISTFILE}`
    `/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString #{version}" #{INFOPLISTFILE}`
    print "version upgraded to #{version}\n"
  end
}

Przygotować: gem install xcodeproj versionomy

Uruchom: rake increment:major lub rake increment:minor lub rake increment:tiny Kiedy tylko chcesz.

 0
Author: mash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-28 11:12:43

Heres zaktualizowaną wersję. Działa to od Xcode 9.3.1, iOS 11.

Kliknij na' Build Phases ' z docelowej aplikacji, kliknij ikonę+, aby dodać nowy skrypt run, a następnie wklej ten kod.

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Przejdź do informacji.plik plist i ustaw 'Bundle version' na 1, A 'Bundle version string, short' na 1, powinieneś być ustawiony.

Zbuduj projekt z Info.plist w widoku i powinieneś zobaczyć zmianę wersji pakietu (numer kompilacji).

  • uwaga że od Xcode 9.3.1, nie będzie w stanie zobaczyć te zmiany z zakładki ogólne, ale będzie zobaczyć zmiany podczas archiwizacji kompilacji, i w Info.plist
 0
Author: L. Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-19 00:11:08