Xcode 13 me dificulta construir mi proyecto que consta de objetivos con fases de construcción que generan código.
Por ejemplo, una fase de compilación genera el archivo Secrets+Generated.swift simplemente usando un script de shell que repite algún código en ese archivo.
La fase de construcción define ese archivo como un archivo de salida. Sin archivo de entrada, sin lista de archivos de entrada y sin lista de archivos de salida, ya que solo se crea/modifica ese archivo.
Casi todo el tiempo al construir el proyecto, la construcción falla:
error: input file '[ProjectPath]/Secrets+Generated.swift' was modified during the build error: input file '[ProjectPath]/Secrets+Generated.swift' was modified during the build Command CompileSwiftSources failed with a nonzero exit code¿Alguien ha encontrado ese problema o sabe qué hacer? Intenté alternar la casilla de verificación "Basado en análisis de dependencia", pero eso no ayudó. No tuve ese problema al usar Xcode 12. Es interesante notar el mensaje de error duplicado a pesar de tener solo una fase de compilación que genera ese archivo en particular.
Por cierto. Tengo el mismo problema cuando uso herramientas de generación de código como swiftgen , Sourcery o Cuckoo .
Editar: Aquí están mis fases de construcción:
Las tres fases de compilación marcadas generan un archivo de este tipo. Todos ellos fallan ocasionalmente. No sé si eso marca la diferencia, pero estos se definen solo para un objetivo (Extensión del servicio de notificación), que es una dependencia del objetivo de mi aplicación principal, por lo que se activa solo una vez cuando construyo la aplicación.
Desafortunadamente, la solución alternativa propuesta por Copripop no funciona al menos para la configuración con Cuckoo. Pero el error de compilación ocurre mucho menos ahora.
Pero recibí una respuesta oficial de Apple de que este error ocurre como se esperaba porque el archivo de entrada se modifica durante el trabajo de compilación. Según entendí, eso sucede porque las fases de compilación pueden ejecutarse en paralelo. Antes de Xcode 13, se evitaba la ejecución paralela cuando la definición del archivo de salida se ajustaba al archivo de entrada de la siguiente fase con el mismo archivo. Esto parece estar roto en Xcode 13.
Sin embargo, la respuesta contenía una pista sobre cómo resolver el problema para las configuraciones que no son de Cuckoo. Se recomienda utilizar reglas de compilación, que se ejecutan durante la fase de compilación de compilación. Aquí el enlace con un marcador de tiempo para este tema: https://developer.apple.com/videos/play/wwdc2021/10210/?time=379
La regla de compilación se puede definir para que coincida con el archivo de origen mediante la convención de nomenclatura y luego ejecute el script correctamente. Los archivos de salida de las reglas de compilación se establecen automáticamente en la fase de compilación de compilación. Así que esto no debería estar definido allí.
Esperemos que esto ayude a algunas personas a resolver el problema, cuando puedan definir una coincidencia mediante la convención de nomenclatura. No encontré un buen enfoque para Cuckoo.
Por cierto: ya hay un problema abierto para Cuckoo: https://github.com/Brightify/Cuckoo/issues/400
Estoy depurando un problema similar en R.swift , creo que encontré la causa del problema.
Xcode 13 parece ejecutar las fases de compilación de Run Script durante las compilaciones de índice. Esto puede hacer que un archivo se escriba mediante un pase de índice, en paralelo con una compilación.
Para verificar si esto le está sucediendo, agregue esto a su script de compilación: say $ACTION
En Xcode 12, solo dice "construir", pero en Xcode 13 lo escucho decir "indexbuild" durante la compilación, cada vez que guardo archivos .swift o navego por mi código.
Para evitar que su secuencia de comandos se ejecute durante la indexación, agregue esta verificación:
if [ $ACTION != "indexbuild" ]; then # your script here fiTenía exactamente el mismo problema. Pude resolverlo cambiando el shell usado de /bin/sh a /bin/zsh . Sin embargo, no me preguntes por qué funciona.
Experimenté el mismo problema en el proyecto iOS de WooCommerce , el objetivo agregado que usamos para generar un archivo .swift con secretos en el momento de la compilación.
Este PR parece solucionar el problema. Digo parece porque no lo he experimentado desde entonces, pero tampoco estoy 100% seguro de que el problema haya desaparecido, porque no estaba ocurriendo el 100% de las compilaciones para mí.
Lo que creo que podría haber hecho el truco fue hacer que la definición de los archivos de entrada y salida del script de ejecución de la fase de compilación fuera homogénea. Anteriormente, configuramos las entradas a través .xcfilelist y las salidas a través de la interfaz de usuario de Xcode. Ahora usamos un .xcfilelist para ambos .
Honestamente, esto me parece un error de Xcode 🙊
EDIT 2: la solución anterior de Tom Lokhorst parece ser la forma correcta de resolver esto: https://stackoverflow.com/a/69481200/12117100
EDITAR: Hay un problema con la solución original. Los usuarios de Xcode 12.5 que intenten compilar el objetivo de prueba obtendrán el error Build input file cannot be found... ya que el script que genera GeneratedMocks.swift podría ejecutarse después de que comience la compilación.
Algo que parece funcionar tanto para Xcode 12.5 como para Xcode 13 es agregar esto a un cuckoo-output.xcfilelist (llámelo como quiera):
${PROJECT_DIR}/${PROJECT_NAME}Tests/GeneratedMocks.swift y agregue esa xcfilelist a las listas de archivos de salida del script de ejecución en lugar de agregar la ruta a GeneratedMocks.swift directamente en los archivos de salida.
Original:
Tuve este problema después de configurar Cuckoo por primera vez en Xcode 13 e incluir ${PROJECT_DIR}/${PROJECT_NAME}Tests/GeneratedMocks.swift en la sección Archivos de salida del script Ejecutar.
Eliminar la ruta de los archivos de salida parece funcionar por ahora.