2011-12-13 8 views
59

Tengo un proyecto de Xcode con un gran número de objetivos donde me gustaría incluir un conjunto de configuraciones para las aplicaciones creadas en las configuraciones Ad-hoc y Debug, pero no en la configuración de Release.¿Cómo puedo incluir condicionalmente un archivo basado en la configuración de compilación en Xcode?

Las fases de compilación no parecen permitirse condicionarse a la configuración (obviamente pueden estar condicionadas al objetivo, pero duplicar el número de objetivos en el proyecto lo haría completamente inutilizable).

Eso deja escribir una regla de compilación personalizada. Mi plan es excluir Settings.bundle de todos los objetivos y crear una regla de compilación que lo copie condicionalmente en el paquete del producto, pero los ejemplos aplicables son realmente difíciles de encontrar.

La regla de compilación que he comenzado tiene la configuración del Proceso establecida en "Archivos de origen con nombres que coinciden:" y Settings.bundle como el nombre. La configuración de Uso es "Script personalizado:".

Mi script personalizado es el siguiente (con la salvedad de que mi fiesta de secuencias de comandos está en un nivel culto cargo):

if [${CONFIGURATION} = 'Debug'] then 
    cp -r ${INPUT_FILE_PATH} ${DERIVED_FILES_DIR}/. 
fi 

Por último, tengo ${DERIVED_FILES_DIR}/Settings.bundle aparece como un archivo de salida.

Desde que estoy aquí, debería ser obvio que no está funcionando. Mi primera pregunta es si hay algún lugar en el que pueda ver el resultado de las reglas de compilación como la ejecución para asegurarse de que 1) en realidad se está ejecutando y que 2) no tengo un error de sintaxis estúpido en alguna parte.

Además, ¿cuál es la ubicación correcta (en forma de una variable de entorno) para copiar la salida?

Respuesta

62

Finalmente lo descubrí.

Para cada objetivo para el que desee incluir condicionalmente el paquete de configuraciones, elija su Proyecto de la lista fuente, elija el objetivo y cambie a la pestaña "Crear fases".

Haga clic en el botón "Agregar fase de compilación" y seleccione "Agregar secuencia de ejecución".

A continuación, introduzca la siguiente información para la secuencia de comandos:

if [ "${CONFIGURATION}" == "Debug" ]; then 
    cp -r "${PROJECT_DIR}/Settings.bundle" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app" 
fi 
3

No soy un experto en scripts de shell, pero creo que necesita espacio entre los corchetes y la condición. Además, citando las variables pueden ser útiles:

if [ "${CONFIGURATION}" = "Debug" ] then 
    cp -r "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}"/. 
fi 

En cuanto a la ubicación, uso "$BUILT_PRODUCTS_DIR"/"$FULL_PRODUCT_NAME" de la raíz de mi OS X paquete de aplicación.

+0

Esto me da errores de sintaxis cuando construyo. La solución de Frank, copiada y pegada, funcionó a la perfección. – Lance

+1

Para ser totalmente justo, la respuesta de este tipo se publicó tres meses antes. – Puppy

38

Sé que esta pregunta ya ha sido contestada, y la respuesta fue muy útil para mí, pero quería tirar mi propia solución modificada por ahí también .

Mi requisito era tener diferentes paquetes de configuraciones para diferentes configuraciones de compilación, en lugar de simplemente no incluirlo en la versión.Asumiendo un enfoque simplista de sólo depuración y lanzamiento configuraciones, aquí está cómo hacerlo:

de inicio mediante la adición de 2 ajustes manojos para el proyecto, denominado Settings-debug.bundle y Settings-release.bundle y luego eliminar estos archivos desde los copiar recursos Bundle fase de construcción. A continuación añadimos una acumulación definida por el usuario ajuste llamado SETTINGS_BUNDLE, que tiene valores diferentes para cada configuración:

Debug  ${PROJECT_DIR}/relative/path/to/Settings-debug.bundle 
Release  ${PROJECT_DIR}/relative/path/to/Settings-release.bundle 

próximo añadir una fase de acumulación de ejecución guión (después Copia Bundle Recursos) llamado Configuración de copia Bundle con un modificado versión del guión en la solución de Frank.

cp -r "${SETTINGS_BUNDLE}/" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle" 

La diferencia aquí es que el paquete copiado siempre se denomina Settings.bundle sin importar el nombre de la fuente.

Luego, debe agregar otro script de fase de compilación para evitar errores de firma de código cuando los únicos cambios se encuentran en los paquetes de configuración. Obliga a que el paso de firma de código ocurra en cada compilación. Esto debería ejecutar antes deCompilar archivos de origen fase de compilación. Llamé al mío Force Codesign.

touch "${PROJECT_DIR}/relative/path/to/main.m" 
+1

Excelente solución para un panel de preferencias de aplicaciones solo de depuración en la aplicación de configuración integrada, que es lo que estaba buscando. ¡Muchas gracias! – benvolioT

+4

También puede escribir: cp -R "$ {}/project_dir settings_bundle/Configuración - Configuración} {$ .bundle /" "$ {} BUILT_PRODUCTS_DIR/$ {PRODUCT_NAME} .app/Settings.bundle" Esta voluntad le permite evitar agregar cualquier entrada de compilación definida por el usuario y usará los archivos 'settings_bundle/Settings-Debug.bundle', 'settings_bundle/Settings-Release.bundle', etc. –

+0

Como variables SETTINGS_BUNDLE, utilicé $ {PROJECT_DIR}/$ {PROJECT_NAME } /Resources/Settings.bundle – Johan

6

Settings.bundle siempre se copia en el área de destino, sin importar si la configuración de lanzamiento o de depuración. Por lo tanto, tal vez usted necesita el siguiente código:

if [ ${CONFIGURATION} == "Release" ]; then 
    rm -rf ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle 
fi 
+0

Este es el único que funcionó para mí +1 – Brett

17

Para las fuentes accedió, hay una configuración definida por el usuario acumulación mal documentado que se puede añadir. Los archivos pueden ser tanto excluidos e incluidos de la compilación

Ir a la configuración de generación de su destino> Pulse el botón +> Añadir definido por el usuario Ajuste

La clave es o bien INCLUDED_SOURCE_FILE_NAMES o EXCLUDED_SOURCE_FILE_NAMES

El valor es un espacio lista separada de las rutas de archivos

Ver referencia: http://lists.apple.com/archives/xcode-users/2009/Jun/msg00153.html

+1

Puedo confirmar que la adición de EXCLUDED_SOURCE_FILE_NAMES sigue funcionando (y aún no está documentado) en Xcode 8.2 .. –

+0

Solución de trabajo para Xcode 8.2.1 – cheeseRoot

Cuestiones relacionadas