xcode scripting project

¿Agregar archivos a un proyecto de Xcode desde un script?



scripting project (6)

Básicamente, los archivos solo necesitan copiarse en el paquete principal

En ese caso, simplemente agregue una referencia de carpeta al proyecto (Cree una carpeta en su carpeta de proyecto y luego arrástrela al grupo de proyectos "Recursos" (en la lista "Archivos y grupos"), luego en la hoja que aparece seleccione "Crear Las referencias de carpetas para cualquier botón de opción de Carpeta agregado "y Xcode copiarán la carpeta y todos sus contenidos en el paquete de destino en tiempo de compilación.

Solo una nota adicional: si usa este método para agregar subcarpetas de imágenes, tendrá que ponerle un prefijo al nombre de la imagen con el nombre de la subcarpeta para usar ''[UIImage imageNamed:]''. Por ejemplo, si tiene una imagen llamada "Rendezvous.png" en una subcarpeta llamada "MyImages":

`

// this won''t work UIImage * image = [UIImage imageNamed:@"Rendezvous"]; if (image) { NSLog(@"Found Rendezvous!"); } else { NSLog(@"Didn''t find Rendezvous."); } // but this will! image = [UIImage imageNamed:@"MyImages/Rendezvous"]; if (image) { NSLog(@"Found MyImages/Rendezvous!"); } else { NSLog(@"Didn''t find MyImages/Rendezvous."); }

`

En este momento estoy usando algunos scripts para generar archivos que incluyo como recursos en Xcode. El caso es que estoy ejecutando el script, luego borrando del proyecto y luego volviendo a agregarlo al proyecto. Debe haber una manera de automatizar este último paso, para que el script pueda generar los archivos y automáticamente agregarlos al proyecto xcode por mí.

Estoy usando bash pero cualquier ejemplo de lenguaje me ayudaría.

Gracias, Andrew


Esto se puede hacer agregando una nueva fase de compilación a su aplicación.

  1. En su navegador de proyectos Xcode, encuentre el destino para su aplicación y amplíelo para mostrar todas las fases de compilación.

  2. Agregue una nueva fase de compilación "ejecutar script" a su objetivo. La forma más fácil es hacer clic con el botón derecho en el objetivo y seleccionar "Agregar / Fase de compilación nueva / Fase de compilación del script de nueva ejecución"

  3. Agregar la nueva fase de compilación debe mostrar una ventana de inspector. En esta ventana, puede ingresar todo el script del shell o simplemente una línea de comando para ejecutar el script.

  4. Aquí está el oro: en la parte inferior de la ventana del inspector puede especificar los archivos de entrada y los archivos de salida. La especificación de los archivos de entrada configura las dependencias automáticamente (el script del shell solo se ejecutará si algunos de los archivos de entrada han sido modificados). La especificación de los archivos de salida propaga automáticamente las dependencias a esos archivos. Cuando se ejecuta su script de shell, Xcode sabe que necesita tratar con los archivos que el script de shell ha modificado.

  5. Asegúrese de arrastrar su nueva fase de compilación hasta la parte superior de la lista de fases, como se muestra en la siguiente captura de pantalla. El pedido será importante si necesita que esos archivos de recursos se incluyan en el paquete.

  6. ¡Guarde, construya, comprométase con el repositorio, solicite un aumento, tome un poco de aire fresco y tenga un buen día! :)


Para aquellos con gran cantidad de archivos, para evitar tener que volver a copiar (o volver a verificar) cada archivo, como lo sugiere @Ben Cochran (muchas gracias por el excelente script), esta es la forma de hacerlo con rsync:


Sé que es un poco tarde, pero acabo de encontrar este artículo explicando cómo hacer algo que suena como lo que estás buscando.


Si ya tiene los archivos en algún lugar de su sistema, en relación con su raíz de origen, siempre puede agregar una fase de "Copiar archivos" . Esto le permitirá especificar un directorio desde donde se deben copiar sus recursos.

Puede combinar esto con la respuesta de la fase Build Script que ya se le proporcionó. Por ejemplo, ejecute un script para verificar sus activos de Subversion en un subdirectorio de su proyecto, y luego continúe con una fase de Copiar archivos que copia de "$ (SRCROOT) / Assets".


Tenía una necesidad similar a la de Andrew. Necesitaba poder incluir recursos de un script sin conocer esos recursos antes de tiempo. Aquí están las soluciones que surgieron:

Agregue una nueva fase de compilación Ejecutar script después de "Copiar recurso de paquete" que contiene el siguiente comando:

find -L ${SRCROOT}/SomeDerivedResources / -type f -not -name ".*" / -not -name "`basename ${INFOPLIST_FILE}`" / | xargs -t -I {} / cp {} ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/

Parece aterrador, pero analicémoslo:

find -L ${SRCROOT}/SomeDerivedResources

Esto rastrea el directorio SomeDerivedResources en nuestra raíz de origen ( -L le dice que siga los enlaces simbólicos)

-type f

Solo incluye archivos regulares

-not -name ".*"

Ignorar archivos comenzando con un punto

-not -name "`basename ${INFOPLIST_FILE}`"

En mi caso, mis listas de información viven en mi directorio SomeDerivedResources, por lo que debemos excluir que ese archivo se copie a nuestro producto

| xargs -t -I {}

Transmitir los resultados de find en xargs con -t (echo los comandos resultantes a stderr para que aparezcan en nuestro log de compilación), -I (ejecutar el comando una vez para cada archivo de entrada) y usar {} como nuestro argumento marcador de posición

cp {} ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/

Por último, copie cada archivo encontrado (denotado por {} ) en el directorio de recursos de nuestro producto.

Me di cuenta al escribir esto que usar una configuración rsync en lugar de cp podría evitar que copiemos recursos cada vez que construimos. Si sus recursos son muy grandes, podría valer la pena visitarlos.

(Además, una referencia de carpeta no funcionaría para mi necesidad por algunas razones. Una, mis íconos están en mi directorio DerivedResources y parece que no tenerlos en un subdirectorio en el paquete no funciona. Además, idealmente quería poder use [UIImage imageNamed:@"MyAwesomeHappyImage.png"] y -pathForResource:ofType: (y algunos de mis archivos están anidados en mi directorio DerivedResources). Si sus necesidades no contienen esas restricciones, le sugiero que vaya a la carpeta ruta de referencia)