Hashing
Características como
caching o laejecución selectiva de pruebas requieren una forma de determinar si un objetivo ha cambiado. Tuist calcula un hash para cada objetivo en el grafo de dependencia para determinar si un objetivo ha cambiado. El hash se calcula basándose en los siguientes atributos:
- Los atributos del objetivo (por ejemplo, nombre, plataforma, producto, etc.)
- Los archivos del objetivo
- El hash de las dependencias del objetivo
Atributos de caché
Además, al calcular el hash para
caching, tambiénhacemos hash de los siguientes atributos.
Versión de Swift
Hacemos hash de la versión de Swift obtenida al ejecutar el comando /usr/bin/xcrun swift --version para evitar errores de compilación debidos a desajustes de versión de Swift entre los objetivos y los binarios.
ESTABILIDAD DEL MÓDULO
Las versiones anteriores del almacenamiento en caché de binarios se basaban en el ajuste de compilación BUILD_LIBRARY_FOR_DISTRIBUTION para habilitar module stability y permitir el uso de binarios con cualquier versión del compilador. Sin embargo, causaba problemas de compilación en proyectos con objetivos que no soportan la estabilidad de módulos. Los binarios generados están vinculados a la versión de Swift utilizada para compilarlos, y la versión de Swift debe coincidir con la utilizada para compilar el proyecto.
Configuración
La idea detrás de la bandera -configuration era asegurar que los binarios de depuración no se utilizaran en las compilaciones de lanzamiento y viceversa. Sin embargo, todavía nos falta un mecanismo para eliminar las otras configuraciones de los proyectos para evitar que se utilicen.
Depuración
Si observas comportamientos no deterministas al utilizar la caché en distintos entornos o invocaciones, puede estar relacionado con diferencias entre los entornos o con un error en la lógica de hash. Te recomendamos que sigas estos pasos para depurar el problema:
- Ejecute
tuist hash cacheotuist hash selective-testing(hashes parabinary caching oselective testing), copie los hashes, cambie el nombre del directoriodel proyecto y vuelva a ejecutar el comando. Los hashes deben coincidir. - Si los hashes no coinciden, es probable que el proyecto generado dependa del entorno. Ejecute
tuist graph --format jsonen ambos casos y compare los gráficos. Alternativamente, genere los proyectos y compare sus archivosproject.pbxprojcon una herramienta de diferencias como Diffchecker. - Si los hashes son los mismos pero difieren entre entornos (por ejemplo, CI y local), asegúrese de que se utiliza la misma configuración y versión Swift en todas partes. La versión de Swift está vinculada a la versión de Xcode, así que confirme que las versiones de Xcode coinciden.
Si los hashes siguen siendo no deterministas, háznoslo saber y podremos ayudarte con la depuración.
PLANIFICADA UNA MEJOR EXPERIENCIA DE DEBUGGING
Mejorar la experiencia de depuración está en nuestra hoja de ruta. El comando print-hashes, que carece de contexto para entender las diferencias, será sustituido por un comando más fácil de usar que utilice una estructura en forma de árbol para mostrar las diferencias entre los hashes.
