Desde la versión 11, Xcode establece mi CFBundleVersion
valor $(CURRENT_PROJECT_VERSION)
y mi CFBundleShortVersionString
valor $(MARKETING_VERSION)
cada vez que ingreso los valores de Versión o Compilación en la configuración de destino (pestaña "General").
La versión real y los valores de compilación que ingreso ahora se almacenan en el archivo project.pbxproj. No quiero o me gusta este comportamiento, ya que uso scripts de shell para modificar los valores en tiempo de compilación.
Puedo configurar manualmente los valores correctos en el archivo Info.plist, pero tan pronto como cambio los números de Versión o Compilación en la configuración de destino, Xcode vuelve a cambiar el archivo Info.plist.
¿Cómo evito que Xcode 11 haga esto?
Cuando modifique mi script de compilación para cambiar el archivo del proyecto en sí, Xcode cancelará inmediatamente la compilación tan pronto como se cambie el archivo del proyecto.
fuente
plistbuddy
es agradable y limpio, mientras que modificar el archivo del proyecto es mucho más desordenado, poco confiable y propenso a cambios inesperados en el formato del archivo.Respuestas:
El camino hasta ahora
Mi caso de uso fue que:
Settigns.bundle
Solía ejecutar los puntos 1 y 2 como un script de compilación de destino y el punto 3 como un script personalizado en el propio CI.
La nueva forma de almacenar la versión y la compilación dentro de la configuración de compilación de Xcode estaba causando problemas con los scripts, porque ya no podían modificar efectivamente los valores. Al menos la lectura era posible.
Desafortunadamente, no pude descubrir una forma legítima de evitar que Xcode almacene la versión y los números de compilación en la configuración de compilación del proyecto, sin embargo, he logrado crear una solución alternativa.
Resulta que cuando se crea una compilación o un archivo,
Info.plist
se utiliza el valor escrito en el . Esto significa que el valor se sustituye durante el tiempo de construcción, lo que no nos permite modificarlo durante el mismo tiempo de construcción.También intenté modificar el proyecto usando
xcodeproj
cli, sin embargo, cualquier cambio en el proyecto causó que las compilaciones se detuvieran, por lo que esta solución no funcionaba.Finalmente, después de muchos enfoques diferentes que probé, finalmente logré encontrar un compromiso que no estaba violando el nuevo comportamiento del Xcode.
Respuesta corta:
Como acción previa del objetivo, se ejecuta un script que escribe los valores respectivos en
CFBundleShortVersionString
yCFBundleVersion
para el objetivoInfo.plist
Como fuente de verdad, uso la configuración de compilación de Xcode para leer los valores de
MARKETING_VERSION
yCURRENT_PROJECT_VERSION
de la meta deseada.De esta manera, cuando modifique los valores de la configuración del proyecto, en la próxima compilación / archivo, se escribirán en el
Info.plist
, permitiendo que su lógica de secuencias de comandos existente continúe funcionando.Respuesta detallada
La única forma de modificar un recurso en una acción de compilación es mediante un
pre-action
script. Si intenta hacerlo desde un script de compilación, los cambios no tendrán efecto de inmediato y no estarán presentes al final de la compilación / archivo.Para agregar una acción previa a la construcción, vaya al esquema de edición.
Luego expanda las secciones Construir y Archivar. Debajo
Pre-action
, haga clic en elProvide build and settings from
menú desplegable y seleccione la fuente del objetivo de verdad desde el que desea leer los valores.Agregue el siguiente script:
Las líneas de script hacen lo siguiente:
MARKETING_VERSION
yCURRENT_PROJECT_VERSION
El último paso es escribir su propio guión de sincronización que lee los valores de la prevista
MARKETING_VERSION
yCURRENT_PROJECT_VERSION
al objetivo / s respectivo y siempre que lo desee.En mi caso, el script es el siguiente:
Uso compartido
Info.plist
ySettings.bundle
entre mis dos objetivos de aplicación, así que tengo que actualizar esto una vez.También uso una extensión de servicio de notificación
BadgeCounter
, que tiene que tener exactamente la misma versión y compilación que el objetivo en el que está incrustado. Así que actualizo esto también.fuente
No lo hagas
Presumiblemente hay una razón por la cual este comportamiento cambió. Si las características posteriores de Xcode se basan en este comportamiento, las cosas se "construyen" más y más en el futuro.
En lugar de intentar doblar Xcode, cambie cómo el script de compilación recupera estos valores:
Cómo leer la versión actual de la aplicación en Xcode 11 con script
Si necesita manipular el
project.pbxproj
archivo, es una lista de estilo Siguiente que está bien documentada. Puede usarplistbuddy
cuál es compatible con este formato antiguo. También puede usarawk
con más secuencias de comandos si tiene manipulaciones más complejas.Si entiendo su caso de uso, podría escribir un script que obtenga los números de versión más altos
awk
y luego actualice todos los números de versión más bajos que pueda encontrar en el archivosed
.fuente
PlistBuddy
parece que la impresión de valores funciona bien, pero cuando uso elset
comando todo el project.pbxproj se convierte en un archivo XML .plist y Xcode ya no puede leerlo. ejemplo:PlistBuddy -c "Set :objects:$configurationId:buildSettings:CURRENT_PROJECT_VERSION $newProjectVersion" "$projectFile"
pbxproj
archivo, cancelará la compilación. Así que realmente no va a funcionar, me temo.