xcode svn

Inserte el número de revisión de Subversion en Xcode



svn (7)

Me gustaría insertar el número de revisión de Subversion actual (según lo informado por svnversion ) en mi proyecto de Xcode. Pude insertar el número de revisión en Info.plist en $PROJECT_DIR , pero esta no es una buena solución, ya que el archivo está versionado. Intenté insertar la revisión en Info.plist en el directorio de compilación, pero luego recibí un error durante la fase de firma del código (esta es una aplicación de iPhone).

¿Existe una manera simple de obtener el número de revisión en la aplicación utilizando algunos archivos de compilación, de modo que la revisión cambiante no modifique los archivos versionados? Pensé que tal vez podría crear un archivo fuente temporal que vincule con los demás y proporcionar una función para obtener el número de revisión. Pero no sé cómo hacer eso.

No estoy muy interesado en otras soluciones, es decir. el agvtool . Todo lo que quiero es el número de revisión disponible para la aplicación, sin demasiada magia.


Como no puedo comentar la respuesta de Quinn:

Si está utilizando el cliente svn de MacPorts, puede ser necesario incluir la ruta completa del comando svnversion, / opt / local / bin / svnversion en mi caso. También agregué la opción -c a svnversion.

Además, si solo está interesado en el segundo número de versión de revisiones mixtas, agregue un comando ''cortar'' a la invocación, como este:

echo -n "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}" / | xargs -0 /usr/libexec/PlistBuddy -c "Set :CFBundleVersion `/opt/local/bin/svnversion -nc | cut -f2 -d:`"


Como nuevo usuario de , no puedo hacer ningún comentario sobre la publicación de Quinn, pero tengo un pequeño cambio para que su solución sea un poco más precisa si está utilizando un repositorio SVN que tiene varios proyectos funcionando a la vez.

Usando su enfoque, el número de svnversión que se devuelve es el último check-in para todo el repositorio, no necesariamente su código base. Este ajuste permite que la actualización sea específica para su código base.

REV=`svnversion -nc | /usr/bin/sed -e ''s/^[^:]*://;s/[A-Za-z]//''` /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $REV" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}

El uso del distintivo -c recogerá la última confirmación realizada en la rama / etiqueta / troncal activa para su base de código en la forma de:, luego cortará los bits que no desea almacenar como número de Revisión.

Además, observe las comillas dobles alrededor de $ {TARGET_BUILD_DIR}. Esos son necesarios para los usuarios que deciden colocar su proyecto en una estructura de directorio con espacios en el nombre.

Espero que esto ayude a otros!


Encontré esta página cuando trato de hacer algo similar para mi aplicación de iPhone y pensé que podría ser útil compartir el código que decidí. Intentaba tener un número de versión base establecido en mi Target Info (por ejemplo, 0.9.5) pero luego agregué mi número de revisión SVN al final. Necesitaba esto almacenado en CFBundleVersion para que los usuarios de AdHoc pudieran actualizarse a través de iTunes, incluso si no recordaba actualizar el número de versión en mi panel de información de destino. Es por eso que no pude usar el método "revision.h" que de otra manera funcionó maravillosamente. Este es el código final que establecí y que coloqué como fase de ejecución del script justo después de la fase de compilación "Copiar recursos del paquete":

BASEVERNUM=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "${INFOPLIST_FILE}" | sed ''s/,/, /g''` REV=`svnversion -n` SVNDATE=`LC_ALL=C svn info | awk ''/^Last Changed Date:/ {print $4,$5}''` /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BASEVERNUM.$REV" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH} /usr/libexec/PlistBuddy -c "Set :BuildDateString $SVNDATE" "${TARGET_BUILD_DIR}"/${INFOPLIST_PATH}

Debería adjuntar los resultados de svnversion al final de lo que esté establecido en la base Info.plist como la versión. De esta forma, puede tener algo así como 0.9.5 en su lista de información y aún tener el número de revisión .189 adjunto al final, dando un número de versión final de 0.9.5.189

¡Espero que esto ayude a alguien más!


Hay una solución mucho más simple: usar PlistBuddy , incluido en /usr/libexec/PlistBuddy en Leopard. Vea mi respuesta a una pregunta de SO relacionada para más detalles.

PlistBuddy se puede utilizar en una fase de compilación Ejecutar script desde Xcode, y se puede usar para afectar solo al archivo plist procesado. Simplemente colóquelo después de la fase Copiar recursos, y ni siquiera tiene que limpiar el objetivo para que se ejecute cada vez. Ni siquiera tiene que imprimir el valor en un archivo de cabecera y hacer que SVN lo ignore.

echo -n ${TARGET_BUILD_DIR}/${INFOPLIST_PATH} / | xargs -0 /usr/libexec/PlistBuddy -c "Set :CFBundleVersion `svnversion -n`"

Suponiendo que agregue la fase de compilación antes de que se produzca la firma del código, su lista debe estar firmada con el valor sustituido.


Otra versión, escrita en Apple Script. Regexp para el valor anterior podría cambiarse, actualmente solo admite versiones en formato XX.XX.XX (mayor, menor, svn rev).

Ejecutado por /usr/bin/osascript

set myVersion to do shell script "svn info | grep /"^Revision:/"" set myVersion to do shell script "echo " & quoted form of myVersion & "| sed ''s/Revision: //([0-9]//)///1/''" as string set myFile to do shell script "echo ${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/" set theOutputFolder to myFile as string set thePListPath to POSIX path of (theOutputFolder & "Info.plist") tell application "System Events" tell property list file thePListPath tell contents set previousValue to value of property list item "CFBundleVersion" set previousValue to do shell script "echo " & quoted form of previousValue & "| sed ''s///([0-9]*//.[0-9]*//)//(//.[0-9]*//)*///1/''" as string set value of property list item "CFBundleVersion" to (previousValue & "." & myVersion) end tell end tell end tell


Para la posteridad, hice algo similar a zoul para las aplicaciones de iPhone, agregando una revisión.h a mi proyecto, luego agregué lo siguiente como una fase de compilación de Ejecutar script:

REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e ''s/^[^:]*://;s/[A-Za-z]//''` echo "#define kRevisionNumber @/"$REV/"" > ${PROJECT_DIR}/revision.h

Hice esto para obtener un número de revisión simple, a diferencia de la cadena más detallada que produce svnversion en la solución de zoul.

Para aplicaciones Mac, basé mi enfoque en esta publicación , y en su lugar creé un archivo buildnumber.xcconfig. Debajo de la configuración de compilación para el objetivo, cambié el valor Basado en en la esquina inferior derecha del cuadro de diálogo a buildnumber.xcconfig. Dentro de Info.plist, edité las siguientes líneas:

<key>CFBundleVersion</key> <string>${BUILD_NUMBER}</string> <key>CFBundleShortVersionString</key> <string>Version 1.0</string>

Para que mi diálogo Acerca de muestre una cadena de versión similar a la Versión 1.0 (1234), donde 1234 es el número de revisión de Subversion. Finalmente, creé una fase de compilación de Run Script con el siguiente código:

REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e ''s/^[^:]*://;s/[A-Za-z]//''` echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig

Puede que esta no sea la manera más limpia, ya que requiere un ciclo de limpieza antes de la construcción para que la nueva revisión se arraigue en la aplicación, pero funciona.


# Xcode auto-versioning script for Subversion # by Axel Andersson, modified by Daniel Jalkut to add # "--revision HEAD" to the svn info line, which allows # the latest revision to always be used. # # modified by JM Marino to change only [BUILD] motif # into CFBundleGetInfoString key. # # HOW TO USE IT: just add [BUILD] motif to your Info.plist key : # CFBundleVersion # # EXAMPLE: version 1.3.0 copyright 2003-2009 by JM Marino # with [BUILD] into CFBundleVersion key use strict; die "$0: Must be run from Xcode" unless $ENV{"BUILT_PRODUCTS_DIR"}; # Get the current subversion revision number and use it to set the CFBundleVersion value #my $REV = `/usr/local/bin/svnversion -n ./`; my $REV = `/usr/bin/svnversion -n ./`; my $INFO = "$ENV{BUILT_PRODUCTS_DIR}/$ENV{WRAPPER_NAME}/Contents/Info.plist"; my $version = $REV; # (Match the last group of digits without optional letter M | S): ($version =~ m/(/d+)[MS]*$/) && ($version = "" . $1); die "$0: No Subversion revision found" unless $version; open(FH, "$INFO") or die "$0: $INFO: $!"; my $info = join("", <FH>); close(FH); #$info =~ s/([/t ]+<key>CFBundleVersion<//key>/n[/t ]+<string>.+)/[BUILD/](<//string>)/$1$version$2/; $info =~ s/([/t ]+<key>CFBundleVersion<//key>/n[/t ]+<string>)/[BUILD/](<//string>)/$1$version$2/; open(FH, ">$INFO") or die "$0: $INFO: $!"; print FH $info; close(FH);