136 votes

Meilleure façon d'incrémenter le numéro de build?

J'ai été en utilisant un script shell dans le cadre de mon Xcode processus de construction d'incrémenter le numéro de version dans le fichier plist fichier, mais il fait Xcode 4.2.1 tomber souvent en panne (avec une erreur sur la cible n'appartenant pas à un projet; j'imagine que l'évolution de la plist fichier est source de confusion Xcode en quelque sorte).

Le script shell a fait pour que le numéro de version est incrémenté uniquement par agvtool lorsqu'un fichier est plus récent que le fichier plist fichier (il suffit donc de bâtiment n'a pas incrémenter la valeur):

if [ -n \"`find ProjDir -newer ProjDir/Project-Info.plist`\" ]; then agvtool -noscm next-version -all; else echo \"Version not incremented\"; fi

Est-il possible d'incrémenter le numéro de version (dans le plist fichier ou n'importe où ailleurs) qui ne se casse pas Xcode?

EDIT: Voici ma dernière solution, basée sur la suggestion de @Monolo. J'ai créé le script suivant dans l' ${PROJECT_DIR}/tools (frère de l' .xcodeproj directory):

#!/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: j'ai modifié le script pour intégrer @Milliways suggestion.

J'ai ensuite invoqué le script à partir de Xcode cible "Phases de construction" de la section: Xcode build phases screenshot

EDIT 3: Comme par @massimobio réponse, vous aurez besoin d'ajouter des guillemets autour de la plist argument s'il contient des espaces.

EDIT 4: il suffit de mettre à jour que ma méthode de prédilection de l'appel de ce script de construction est désormais de créer une cible et rendre l'application de la cible dépend de cette Bosse le Numéro de Build de la cible. Ceci assure que c'est invoquée avant l'application cible n' importe quoi avec le fichier plist (j'ai remarqué qu'il aime processus plist au début de la construction). J'ai aussi opté pour une approche purement basée sur python solution qui maintient le numéro de version dans un fichier séparé, et écrit la version des fichiers source, ce qui est plus utile pour la croix-plate-forme de produits (par exemple Visual Studio sous Windows peut invoquer le script, et, évidemment, cmake/faire-type construit peut le faire aussi). Ceci a l'avantage que le numéro de build est toujours le même, même sous différentes plates-formes, et il est également possible de mettre à jour Visual Studio Resource.rc le fichier avec la version actuelle/construire ainsi.

77voto

Wil Gieseler Points 155

J'ai foiré autour avec un grand nombre de réponses sur cette question, et aucun d'entre eux tout à fait satisfait de moi. Cependant, j'ai enfin venu avec un mélange que j'aime vraiment!

Il y a deux étapes, l'une au début et une à la fin de vos phases de construction.

Au début:

# 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}"

À la fin:

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

En regardant les informations.plist dans Xcode, vous verrez le numéro de version est le "DÉVELOPPEMENT", mais l'application sera toujours plus le numéro de build. (Aussi longtemps que vous le faites toujours de votre repose sur la même branche.)

Réglage du numéro de version retour à une constante chaîne de caractères à la fin empêche l'Info.fichier plist d'être modifiés par la construction de l'application.

Pourquoi j'aime cette méthode:

  • Facile
  • Ne pas polluer Git version de l'histoire
  • CFBundleVersion est totalement automatique
  • Le joli numéro de version peut être modifié chaque fois que je veux

38voto

Alix Points 450

J'ai utilisé cette glist son génial et fonctionne comme prévu. https://gist.github.com/sekati/3172554 (tout le crédit va à l'auteur original)

Sctipts que j'ai modifié au cours du temps.

xcode-versionString-generator.sh,

xcode-build-number-generator.sh

Comme ces gist aident communauté de dev. J'ai pensé à fait github du projet. Donc permet de développer de bonnes. Voici le projet github: https://github.com/alokc83/Xcode-build-and-version-generator

Pour La Version :

# 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}"

Pour construire:

# 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}"

29voto

Monolo Points 11263

Si je comprends votre question correctement, vous souhaitez modifier l' Project-Info.plist le fichier, qui est une partie de l'équipement standard du modèle de projet de Xcode?

La raison pour laquelle je demande c'est qu' Project-Info.plist normalement est sous contrôle de version, et en le modifiant signifie qu'il sera marqué comme modifié.

Si c'est bien avec vous, alors ce sera de mettre à jour le numéro de build et de marquer le fichier modifié dans le processus:

#!/bin/sh

build_number = `get_build_number`

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

PlistBuddy vous permet de fixer toutes les clés dans un fichier plist, et pas seulement le numéro de version. Vous pouvez créer tous les fichiers plist que vous voulez, et de les inclure dans les ressources si nécessaire. Ils peuvent ensuite être lues à partir de la liasse.

Quant à vos besoin pour afficher la version de la sur le volet et d'autres endroits, vous pouvez aussi regarder paramètre CFBundleGetInfoString et CFBundleShortVersionString.

14voto

LostInTheTrees Points 508

Toute cette entrée a été extrêmement utile. J'ai utilisé cette astuce, mais à configurer mon script en tant que post-commit hook GIT, donc CFBundleVersion est incrémenté après chaque succès de la commettre. Le script hook .git/hooks. Un journal de bord, à gauche dans le répertoire du projet.

Cela répond à mon critère de base. Je veux être en mesure de tirer une version de GIT et de reconstruction exacte de construire, j'ai eu précédemment. Tout incrément fait pendant le processus de génération ne fait pas cela.

Voici mon script:

#!/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

11voto

Jay Points 2843

FWIW - c'est ce que je suis en train d'utiliser pour augmenter le numéro de build uniquement pour les versions release (qui comprend l'archivage). Fonctionne bien sous Xcode 5.1.

Il suffit de copier/coller l'extrait dans un Exécuter le script phase de construction directement dans 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;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X