2012-11-10 13 views
5

sto usando questo come una fase di costruzione nel mio progetto:Aggiornamento CFBundleShortVersionString in dSYM alla compilazione?

export PLISTBUDDY="/usr/libexec/PlistBuddy" 

export INFO="${CODESIGNING_FOLDER_PATH}/Info.plist" 
export RXREVISION=`git describe --tags | perl -pi -E "s/[^-]+\-([^-]+).*/\1/"` 
export RXVERSION=`git describe --tags | perl -pi -E "s/([^-]+)\-[^-]+.*/\1/"` 
$PLISTBUDDY $INFO -c "add CFBundleVersion string $RXREVISION" 
$PLISTBUDDY $INFO -c "set :CFBundleVersion $RXREVISION" 
$PLISTBUDDY $INFO -c "add CFBundleShortVersionString string $RXVERSION" 
$PLISTBUDDY $INFO -c "set :CFBundleShortVersionString $RXVERSION" 

Questo funziona perfettamente per l'aggiornamento della revisione configurazione in Info.plist dell'applicazione integrata, e non mutare il mio albero dei sorgenti.

Ho provato a inserire lo script di versione di aggiornamento sia alla fine che prima della fase di collegamento. In ogni caso, è in grado di influenzare le modifiche all'applicazione creata, ma il dSYM è costruito dall'albero dei sorgenti originale.

Questa discrepanza tra i numeri di versione tra l'app sviluppata e il dSYM creato è un problema. (HockeyApp genera un errore qui.)

Se aggiorno Info.plist nell'albero dei sorgenti, ho bisogno di gestirlo cambiando. Che mi lascia due opzioni che posso vedere:

  1. Metti Info.plist sotto il controllo del codice sorgente e fallo modificare direttamente dallo script. Ma questo significa che dovrò controllare le modifiche dopo ogni build.
  2. Ignora Info.plist e fallo modificare direttamente dallo script. Ma ci sono un sacco di altre cose in Info.plist che io do voglio sotto il controllo del codice sorgente.

Come posso aggiornare automaticamente anche la versione nel dSYM, senza dover gestire Info.plist nell'albero dei sorgenti cambiando ogni build?

Inoltre, in modo tangenziale: come si vede la versione in dSYM?

+0

sto forse manca qualcosa, ma la soluzione banale sto pensando è la cancellazione della directory dSYM se c'è qualcosa che non va. Se stai costruendo con i simboli di debug, sarà comunque rigenerato. –

+0

A meno che non permetta alla struttura di mutare l'albero dei sorgenti, eliminando il dSYM e ricostruendo, il dSYM verrà ricostruito con CFBundleShortVersionString errato. Vorrei che la compilazione non manipolasse alcuna fonte di un git. (Ovviamente, farò qualsiasi mutazione * I * ho bisogno di fare e check-in per farlo funzionare, solo non per build.) –

+0

Qual è l'ordine di esecuzione delle fasi di compilazione? Quando viene eseguita la fase personalizzata? – Felix

risposta

1

Il pacchetto dSYM ha anche un info.plist nella cartella radice con valori simili. Probabilmente potresti modificarlo anche in un modo simile.

Un'altra opzione è definire il numero di versione in un file .xcconfig aggiuntivo e includere il numero di versione dal file info.plist, vedere here.

Si potrebbe quindi anche decidere quale tipo di versioni che si desidera o rilasciare o il test costruisce, utilizzando più info.plist file indipendenti e riferimento a diversi .xcconfig file nelle impostazioni di generazione e non includono quello per il test costruisce sotto il controllo del codice sorgente .

In generale, suggerirei di eseguire il commit di ogni cambio di versione, poiché ciò rende il codice realmente riproducibile e lo identifica in modo univoco nel sistema di controllo del codice sorgente.

Oltre a ciò, Apple specifica di impostare CFBundleVersion in una "stringa monotonicamente aumentata, comprendente uno o più numeri interi separati da un punto", vedere here. CFBundleShortVersionString è la tua versione di marketing, ad es. il tuo obiettivo è di lavorare sulla versione 3.0.

Così come su facendo quanto segue per una build di rilascio: Aggiornamento CFBundleVersion con il nuovo numero di build e CFBundleShortVersion con la nuova versione di marketing come 3.0 Beta 1 e impegnarsi ciascuno di essi e poi tag che commettono per il rilascio. I numeri di versione fanno parte della tua fonte come qualsiasi altro metadati, specialmente se il numero di versione viene utilizzato anche per attivare codice specifico per compatibilità, aggiornamenti del database o altro (cosa che spesso avviene).

+0

Quello che effettivamente faccio è estrarre la versione dal tag git. Quindi la versione è nel controllo del codice sorgente, è solo una parte dei metadati invece dei dati principali. Ad ogni modo: non stavo vedendo le chiavi in ​​Info.plist. Grazie! –

4

La risposta accettata è corretto, ma non fornisce i dati reali su come modificare il plist per il dsym. Aggiungendo le seguenti righe allo script di build modifica il plist nella dsym:

cd "$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app.dSYM/Contents" 
$PLISTBUDDY -c "Set CFBundleVersion $RXREVISION" Info.plist 
+0

L'utilizzo di '" $ DWARF_DSYM_FOLDER_PATH/$ DWARF_DSYM_FILE_NAME/Contents/Info.plist "' potrebbe essere più a prova di futuro. –

1

Ecco lo script completo per il “Set CFBundleVersion da Git” build fase sto usando:

APP_INFO_PLIST="${TARGET_BUILD_DIR}/${INFOPLIST_PATH}" 
DSYM_INFO_PLIST="${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist" 

BUILD_NUMBER=`git rev-list HEAD --count` 

/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "$APP_INFO_PLIST" 
if [ -f "$DSYM_INFO_PLIST" ] ; then 
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "$DSYM_INFO_PLIST" 
fi 

(Nota si deve eseguire dopo “Copia Bundle Risorse” in Xcode 6.)

+0

Non funziona per me in xcode 7. Esecuzione dopo "Copia risorse pacchetto". Il controllo dell'esistenza passa, eppure ottengo ancora un errore di lettura impossibile durante il tentativo di distribuire l'app su un dispositivo di prova tramite xcode. Qualche altra impostazione che dovrei cercare? – lostintranslation

+0

@lostintranslation Sembra improbabile che abbia qualche relazione con questo passaggio o Xcode 7. –

0

ho creato uno script che posso cadere in qualsiasi cartella del progetto Xcode e chiamare da uno script Run che aggiornerà l'Info.plist per l'applicazione e il dSYM in modo che la costruzione numero corrisponde. Può quindi essere caricato su servizi come HockeyApp e iTunes Connect per TestFlight e App Store.

preferisco per gestire lo script al di fuori di Esegui script di Xcode perché posso modificare più facilmente e mantenere il contenuto del file di progetto molto più piccolo. Posso anche controllare la versione dello script indipendentemente dal file di progetto.

Il Build Number in questo script è impostato con solo la data corrente. Esistono altri modi per generare un numero di build univoco. Un approccio è coperto dal blog di Jared Sinclair che utilizza l'hash Git per l'ultimo commit. Lo script che sto usando utilizza un timestamp che scende ad un minuto. Trovo utile sapere quando è stata creata una build e con il numero di build raddoppiato come timestamp posso vedere immediatamente la data. E per i miei scopi è abbastanza unico.

http://blog.jaredsinclair.com/post/97193356620/the-best-of-all-possible-xcode-automated-build

#!/bin/sh 
set -e 

# Purpose: Updates Info.plist for app and dSYM to a unique value for each build. 

# Usage: 
# Add as a Run Script in Xcode Build Phases 

# UPDATE_SCRIPT=${PROJECT_DIR}/update_build_number.sh 
# if [ -f ${UPDATE_SCRIPT} ]; then 
#  sh ${UPDATE_SCRIPT} 
# fi 

BUILD_NUMBER=`date "+%Y.%m.%d.%H%M"` 
APP_INFO_PLIST=${TARGET_BUILD_DIR}/${INFOPLIST_PATH} 
DSYM_INFO_PLIST=${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist 

if [ -f ${APP_INFO_PLIST} ]; then 
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "${APP_INFO_PLIST}" 
    echo "Updated ${APP_INFO_PLIST}" 
else 
    echo "Could not find ${APP_INFO_PLIST}" 
fi 

# Only the Release Configuration creates the dSYM 
if [ "${CONFIGURATION}" = 'Release' ]; then 
    if [ -f ${DSYM_INFO_PLIST} ]; then 
     /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "${DSYM_INFO_PLIST}" 
     echo "Updated ${DSYM_INFO_PLIST}" 
    else 
     echo "Could not find ${DSYM_INFO_PLIST}" 
    fi 
fi 
Problemi correlati