Encuentra archivos perdidos en múltiples objetivos Xcode

Hola, soy Sanya, desarrollador de iOS y en este artículo compartiré mi manera de resolver el dolor de cabeza que ocurre cuando trabajo en un proyecto con varios objetivos.



Preveo la pregunta "¿por qué necesita varios objetivos en el proyecto, Sanya?" Respondo: en el proyecto donde trabajé una vez, había un objetivo vinculado a la cuenta del cliente, de modo que:


  • no teníamos acceso a esta cuenta;
  • no había posibilidad de generar perfiles de suministro y certificados de distribución;
  • La peor parte fue que no era posible agregar nuevos dispositivos a los perfiles de aprovisionamiento.

Por lo tanto, al comprar nuevos dispositivos en el estudio, estábamos esperando toda una serie de negociaciones con el lado del cliente para agregarlos a su cuenta y tener la oportunidad de probarlos.


La solución era obvia: crear un segundo objetivo, que será similar al principal, pero que tendrá una identificación de paquete diferente y que estará completamente vinculada a nuestra cuenta de estudio. Apenas dicho que hecho! El segundo objetivo nos permitió realizar un desarrollo completo independientemente de los desarrolladores del lado del cliente, lo que salvó el proceso de desarrollo más de una vez, por ejemplo, cuando los desarrolladores del cliente eliminaron todos nuestros dispositivos en el perfil de suministro del objetivo principal y no pudimos ejecutar la aplicación en sus dispositivos.


Todavía pueden aparecer varios objetivos en su proyecto cuando sea necesario, por ejemplo:


  • Recopile varias aplicaciones de una base de código, pero con diferentes recursos;
  • Mantenga múltiples instancias de la aplicación en un dispositivo.

Pero trabajar en varios objetivos conduce a sus inconvenientes, lo principal es la necesidad de controlar estrictamente el proceso de agregar nuevos archivos al proyecto. Ambos son idénticos entre sí, respectivamente, cuando se agrega un nuevo archivo al proyecto, es necesario poner una marca delante de ambos objetivos.



Esto es muy difícil cuando se trabaja en un gran equipo multinivel, tanto en habilidad como en buena fe.


Si no sigue esta regla simple, después de la siguiente combinación, puede encontrar que uno de los objetivos ha dejado de recolectarse, y Xcode jura que no puede encontrar una u otra clase. Pero lo más interesante es que si alguien no ha agregado un archivo de Copiar recursos de paquete a ambos objetivos (por ejemplo, celdas xib), solo puede encontrar ese error en tiempo de ejecución.


Después de otro problema con el objetivo de depuración, decidimos dar control sobre la coherencia de los objetivos del script. Elegimos el lenguaje Ruby como herramienta, ya que tiene una excelente gema xcodeproj , que es casi el estándar para escribir herramientas para el desarrollo de iOS (ver fastlane, generamba, etc.).


Como resultado, desarrollamos un script que implementa la siguiente lógica de trabajo:


  • la ruta al archivo del proyecto y los nombres de los objetivos probados se envían a la entrada;
  • de camino al proyecto, el script encuentra el proyecto en sí mismo;
  • selecciona los objetivos deseados, recopila archivos de ellos (compilar fuentes, copiar recursos de paquetes y marcos);
  • buscando la diferencia entre las listas de archivos;
  • sacamos archivos de nuestra lista blanca de esta diferencia. Por ejemplo, archivos con constantes que difieren según el destino (baseUrl, si decide organizar el proyecto para que las aplicaciones de diferentes objetivos accedan a diferentes servidores), o archivos GoogleService-Info.plist, que serán diferentes para diferentes objetivos.

Si el script encuentra una diferencia, tenemos un problema. Esto significa que este o aquel archivo / marco se agregó a un objetivo, pero no se agregó a otro.


Por lo tanto, el script le permite:


  • asegúrese de que todos los archivos de Compile Sources y Copy Bundle Resources se hayan agregado correctamente a ambos destinos;
  • También se verifica la identidad de las listas de marcos agregados, lo cual es muy importante si su proyecto tiene una arquitectura de módulos múltiples;
  • la integración de la secuencia de comandos en la fase de compilación le permitirá identificar el problema incluso antes de la etapa de compilación del proyecto;
  • y si antes recopiló ambos objetivos en CI para esto, ahora puede dejar el ensamblado en solo uno, reduciendo el tiempo de ensamblaje en CI a la mitad.

En caso de error, en Xcode puede observar el siguiente mensaje:



En caso de éxito, encontrarás unicornios:



Instrucciones detalladas para agregar al proyecto, configuraciones, así como Ejemplo-proyecto en el repositorio .


La utilidad resultante muestra perfectamente que, incluso como desarrollador de iOS, puede hacer una pequeña pieza de creatividad en su trabajo diario y hacer automatización y secuencias de comandos que simplificarán su vida.


Gracias por su atencion!

Source: https://habr.com/ru/post/480960/


All Articles