¿Cómo puedo establecer dinámicamente el número de compilation de mi aplicación sin ensuciar mi tree fuente?

Estoy usando git-svn y estoy tratando de insert mi número de revisión en mi aplicación de iOS. Por el momento, tengo una fase de compilation que ejecuta el siguiente script:

SVN_REVISION=$(git svn find-rev HEAD) /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $SVN_REVISION" "$INFOPLIST_FILE" 

El problema con esto es que, dado que el repository siempre contiene la revisión anterior , el script siempre hace sucio a mi Info.plist.

¿Es posible para mí establecer dinámicamente el número de compilation de mi aplicación sin ensuciar mi tree fuente?

1) Agregue un nuevo objective a su proyecto de tipo "Agregado", por ejemplo, puede nombrarlo "Actualizar encabezado de prefijo Info.plist"; solo use eso como "Nombre del producto" en el cuadro de dialog.

2) Agregue una fase de compilation Ejecutar script a este nuevo objective con el siguiente código fuente:

 #!/bin/sh SVN_REVISION=$(git svn find-rev HEAD) echo "#define SVN_REVISION $SVN_REVISION" > "$SCRIPT_OUTPUT_FILE_0" 

3) Agregue un file de salida a su secuencia de commands, asígnele el nombre

 $(CONFIGURATION_TEMP_DIR)/InfoPlist.pch 

4) Abre las fases de compilation de tu aplicación de iOS.

5) Agregue el objective agregado que creó anteriormente como objective dependiente (agréguelo a "Dependencias de destino"). Esto significa que Xcode siempre buildá primero este objective antes de que construya su objective de iOS.

6) Abra la configuration de compilation de su aplicación iOS.

7) Busque el ajuste "Info.plist Preprocessor Prefix File" y cámbielo a exactamente el mismo valor que utilizó para el file de salida en el paso (3).

8) Busque la configuration "Preprocess Info.plist File" y asegúrese de que esté habilitada.

9) Abra su file Info.plist actual y cambie el valor de CFBundleVersion a SVN_REVISION . No use $ (SVN_REVISION) o $ {SVN_REVISION}; esto no es una configuration de compilation o reemploop de variable de entorno, este es un reemploop de preprocesador, entonces simplemente use SVN_REVISION.

Eso es. Cada vez que construyes tu aplicación iOS, Xcode crea primero el objective agregado, que actualiza el file PCH, y cuando crea tu aplicación iOS, ejecuta el file Info.plist a través del preprocesador C (usando el file PCH como prefijo) encabezado) antes de copyrlo a su aplicación. El preprocesador replaceá SVN_REVISION ya que se define como una macro en su file PCH.

Notas importantes

Algunas personas pueden pensar que es una mejor idea usar $(DERIVED_FILE_DIR) lugar de $(CONFIGURATION_TEMP_DIR) . Bueno, en teoría tienen razón, pero solo hay un problema en la práctica: el directory de files derivado es diferente para cada objective, mientras que el directory de configuration de configuration es el mismo (solo es diferente para cada configuration de compilation). Al usar el directory de files derivados, el file PCH se escribe en el directory de files derivado del objective agregado, pero al build la aplicación iOS, Xcode searchá este file en el directory de files derivados de la aplicación iOS y, por lo tanto, no encontrará el file.

Algunas personas también pueden pensar que es mejor agregar la fase Ejecutar script que actualiza el encabezado del prefijo como la primera fase de compilation de su aplicación iOS en lugar de crear un destino separado para ella (esto también resolvería el problema derivado del directory de files mencionado encima). De nuevo, buena idea en teoría pero no puede funcionar en la práctica: si se solicita preprocess, Info.plist se procesa antes de que se ejecute la primera fase del script, por lo que si el file PCH no existe o no se ha actualizado ya, el la compilation termina con un error o se escribe una revisión SVN desactualizada en el file plist. Es por eso que necesita un objective diferente para esta tarea que se garantiza que será antes de su objective real.

Mecki gracias por la excelente respuesta! Apliqué el mismo concepto para establecer una timestamp de versión y el git SHA actual para la compilation. FYI me encontré con un pequeño problema. Parece que, al less en Xcode 5, si especifica un file de salida, el paso del script lo usa como un caching, así que no importa los cambios que realice en el código de la aplicación real, el script informó que se ejecutó pero los valores no eran los los actuales … Tuve que mover la statement del file de salida al script en sí para resolver el problema, es decir, añadí

 SCRIPT_OUTPUT_FILE_0="$CONFIGURATION_TEMP_DIR/InfoPlist.pch" 

a la cima de mi script Además, el plist original también debe tocarse para que el paso de compilation copie los nuevos valores, así que también agregué

 `touch $SCRIPT_INPUT_FILE_0` 

después de la statement del file de salida anterior. Esta operación táctil no hace que git detecte el cambio como comprometible.

Aclamaciones