2011-03-14 8 views
9

Para poner en marcha un sistema de integración continua, Hudson, escribí un script bash para crear el proyecto Xcode automáticamente. Además, en la configuración de depuración, me fue solicitado insertar el número de revisión svn del proyecto en el campo CFBundleRevision del archivo PROJECT-Info.plist como $ {BUNDLE_VERSION} .r $ {SVN_REVISION}.Script Bash para editar el campo CFBundleVersion del archivo PROJECT-Info.plist

Encontrará el código fuente del archivo de proyecto-Info.plist a continuación:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
[...] 
    <key>CFBundleVersion</key> 
    <string>1.0</string> 
[...] 
</dict> 
</plist> 

probé este script bash a continuación:

sed 'N;s_^.*<key>CFBundleVersion</key>.*<string>[0-9][0-9]*\.[0-9][0-9]*</string>$_<key>CFBundleVersion</key>\ 
<string>'"$BUNDLE_VERSION"'\.r'"$SVN_REVISION"'</string>_' $PROJECT-Info.plist 

Este script debe reemplazar la cadena "1.0" con $ {BUNDLE_VERSION} .r $ {SVN_REVISION} (solo en salida estándar actualmente). Sin embargo, el reemplazo funciona sin la opción 'N' que incluye la siguiente línea en el proceso sed y para una línea a la vez. Pero hay muchas líneas con la cadena "<string>[...]</string>" en el archivo PROJECT-Info.plist ...

Creo que es mi forma de procesar los caracteres desconocidos entre las dos líneas (opción 'N' y ". *" Para cualquier personaje) es incorrecto.

¿Alguna idea?

Gracias de antemano y disculpas por mi mal nivel en inglés.

+0

Es necesario utilizar una herramienta XML adecuada tal como Python o Perl módulo que está diseñado con el propósito de manipular las claves y valores en un archivo XML. También hay utilidades shell disponibles como xmlstarlet. [Regexes no están a la altura del desafío] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454). Por cierto, tu inglés es casi perfecto. –

+0

Gracias por la solución de utilidad de shell [xmlstarlet] (http://xmlstar.sourceforge.net/). Lo descargué e instalé. Lo probaré mañana y te daré mi opinión. –

Respuesta

0
$ myversion=1.0.3 
$ perl -O777 -i.bak -pe 's|<key>CFBundleVersion</key>\\s*<string>[\d.]*</string>|<key>CFBundleVersion</key></key>'"$myversion"'<string>|' bundle 

mueve el archivo bundle-bundle.bak, y reemplaza 1.0.6.9 con 1.0.3 en el nuevo archivo bundle.

+0

Voy a probar esta solución primero cuando vuelva a trabajar mañana. Gracias :) –

+0

¡Estoy tan curioso que lo intenté inmediatamente y funciona bien! Acabo de modificar esta línea de comando de la siguiente manera porque hago una copia de seguridad del archivo .plist anteriormente en mi script y lo restauro al final. 'perl -0777 -PE "s | CFBundleVersion \ s * [\ d.] * | CFBundleVersion $ BUNDLE_VERSION.r $ Revision |" PROYECTO-Info.plist.bak> PROYECTO-Info.plist' Gracias a ambos. –

+0

donde ejecutar este código – Warewolf

24

Uso PlistBuddy:

# cf. http://davedelong.com/blog/2009/04/15/incrementing-build-numbers-xcode 
/usr/libexec/PlistBuddy -h 
/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" test.plist 
myversion=1.0.5 
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion '${myversion}'" test.plist 
+0

+1. Obviamente el camino a seguir. – bobbogo

+0

Gracias. Esta es la forma correcta de hacerlo.La otra respuesta es un truco muy innecesario. – chown

6

En este caso específico también se puede usar Xcode de agvtool. Ni siquiera necesita proporcionar la ruta al archivo PROJECT-Info.plist. Dentro de su proyecto de ejecución dir:

agvtool new-version -all "$BUILD_NUMBER" # sets CFBundleVersion 
agvtool new-marketing-version "$BUNDLE_VERSION" # sets CFBundleShortVersionString 
+0

El enlace de la wiki está muerto. –

+0

¡Funciona para mí! ¡Gracias! El agvtool se debe usar en la carpeta Proyecto. – Marslo

Cuestiones relacionadas