Hashing
Características como caching o la ejecució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én hacemos 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.
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 para binary caching o selective testing), copie los hashes, cambie el nombre del directorio del 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.
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.