Caché de módulos
- Un proyecto generado por
- A Cuenta tuista y proyecto
Tuist Module cache proporciona una potente forma de optimizar tus tiempos de
compilación almacenando en caché tus módulos como binarios (.xcframeworks) y
compartiéndolos a través de diferentes entornos. Esta capacidad te permite
aprovechar los binarios generados previamente, reduciendo la necesidad de
repetir la compilación y acelerando el proceso de desarrollo.
Calentamiento#
Tuist utiliza eficientemente hashes para cada objetivo en el grafo de dependencia para detectar cambios. Utilizando estos datos, construye y asigna identificadores únicos a los binarios derivados de estos objetivos. En el momento de generar el grafo, Tuist sustituye sin problemas los objetivos originales por sus correspondientes versiones binarias.
Esta operación, conocida como "warming", produce binarios para uso local o para compartir con compañeros de equipo y entornos CI a través de Tuist. El proceso de calentamiento de la caché es sencillo y puede iniciarse con un simple comando:
tuist cache
El comando reutiliza binarios para acelerar el proceso.
Uso#
Por defecto, cuando los comandos de Tuist necesitan generar un proyecto, sustituyen automáticamente las dependencias por sus equivalentes binarios de la caché, si están disponibles. Además, si especificas una lista de objetivos en los que centrarte, Tuist también sustituirá cualquier objetivo dependiente por sus binarios de la caché, siempre que estén disponibles. Para aquellos que prefieren un enfoque diferente, hay una opción para optar por este comportamiento por completo mediante el uso de una bandera específica:
tuist generate # Only dependencies
tuist generate Search # Dependencies + Search dependencies
tuist generate Search Settings # Dependencies, and Search and Settings dependencies
tuist generate --no-binary-cache # No cache at all
tuist test
La caché binaria es una función diseñada para flujos de trabajo de desarrollo,
como la ejecución de la aplicación en un simulador o dispositivo, o la ejecución
de pruebas. No está pensada para compilaciones de lanzamiento. Al archivar la
aplicación, genera un proyecto con los fuentes utilizando la opción
--no-binary-cache.
Perfiles de caché#
Tuist admite perfiles de caché para controlar la agresividad con la que se sustituyen los objetivos por binarios en caché al generar proyectos.
- Empotrados:
only-external: reemplaza sólo las dependencias externas (por defecto del sistema)all-possible: reemplazar tantos objetivos como sea posible (incluidos los objetivos internos)none: nunca reemplazar con binarios en caché
Seleccione un perfil con --cache-profile en tuist generate:
# Built-in profiles
tuist generate --cache-profile all-possible
# Custom profiles (defined in Tuist Config)
tuist generate --cache-profile development
# Use config default (no flag)
tuist generate
# Focus on specific targets (implies all-possible)
tuist generate MyModule AnotherTarget
# Disable binary replacement entirely (backwards compatible)
tuist generate --no-binary-cache # equivalent to --cache-profile none
Precedencia a la hora de resolver la conducta efectiva (de mayor a menor):
--no-binary-cache→ profilenone- Enfoque de objetivos (pasar objetivos a
generar) → perfiltodo-posible --perfil de caché- Configuración por defecto (si está configurada)
- Sistema por defecto (
only-external)
Productos compatibles#
Tuist sólo puede almacenar en caché los siguientes productos de destino:
- Frameworks (estáticos y dinámicos) que no dependen de XCTest
- Paquetes
- Macros Swift
Estamos trabajando para dar soporte a las librerías y objetivos que dependen de XCTest.
Cuando un objetivo no es almacenable en caché, hace que los objetivos anteriores
tampoco lo sean. Por ejemplo, si tienes el gráfico de dependencias A > B,
donde A depende de B, si B no es almacenable en caché, A tampoco lo será.
Eficacia#
El nivel de eficacia que puede alcanzarse con la caché binaria depende en gran medida de la estructura del grafo. Para obtener los mejores resultados, recomendamos lo siguiente:
- Evite los gráficos de dependencia muy anidados. Cuanto menos profundo sea el gráfico, mejor.
- Define las dependencias con objetivos de protocolo/interfaz en lugar de objetivos de implementación, e inyecta las implementaciones de dependencias desde los objetivos superiores.
- Dividir los objetivos modificados con frecuencia en otros más pequeños cuya probabilidad de cambio sea menor.
Las sugerencias anteriores forman parte de La arquitectura modular, que proponemos como una forma de estructurar sus proyectos para maximizar los beneficios no sólo de la caché binaria, sino también de las capacidades de Xcode.
Configuración recomendada#
Recomendamos tener un trabajo CI que ejecute en cada commit en la rama
principal para calentar la caché. Esto asegurará que la caché siempre contenga
binarios para los cambios en main para que la rama local y CI construyan
incrementalmente sobre ellos.
El comando tuist cache también hace uso de la caché binaria para acelerar el
calentamiento.
A continuación se ofrecen algunos ejemplos de flujos de trabajo habituales:
Un desarrollador empieza a trabajar en una nueva función#
- Crean una nueva rama a partir de
principal. - Ejecutan
tuist generan. - Tuist extrae los binarios más recientes de
mainy genera el proyecto con ellos.
Un desarrollador introduce cambios#
- El proceso CI ejecutará
xcodebuild buildotuist testpara construir o probar el proyecto. - El flujo de trabajo extraerá los binarios más recientes de
mainy generará el proyecto con ellos. - A continuación, construirá o probará el proyecto de forma incremental.
Configuración#
Límite de concurrencia de la caché#
Por defecto, Tuist descarga y sube artefactos de caché sin ningún límite de
concurrencia, maximizando el rendimiento. Puedes controlar este comportamiento
utilizando la variable de entorno TUIST_CACHE_CONCURRENCY_LIMIT:
# Set a specific concurrency limit
export TUIST_CACHE_CONCURRENCY_LIMIT=10
tuist generate
# Use "none" for no limit (default behavior)
export TUIST_CACHE_CONCURRENCY_LIMIT=none
tuist generate
Esto puede ser útil en entornos con un ancho de banda de red limitado o para reducir la carga del sistema durante las operaciones de caché.
Solución de problemas#
No utiliza binarios para mis objetivos#
Asegúrese de que los
hashes son deterministas entre entornos y ejecuciones. Esto puede ocurrir
si el proyecto tiene referencias al entorno, por ejemplo a través de rutas
absolutas. Puede utilizar el comando diff para comparar los proyectos
generados por dos invocaciones consecutivas de tuist generate o a través de
entornos o ejecuciones.
Asegúrese también de que el objetivo no depende directa o indirectamente de un objetivo no almacenable en caché.
Símbolos que faltan#
Cuando se utilizan fuentes, el sistema de compilación de Xcode, a través de los
datos derivados, puede resolver las dependencias que no se declaran
explícitamente. Sin embargo, cuando se confía en la caché binaria, las
dependencias deben declararse explícitamente; de lo contrario, es probable que
aparezcan errores de compilación cuando no se encuentren los símbolos. Para
depurar esto, recomendamos usar el comando
tuist inspect implicit-imports y configurarlo en CI para prevenir
regresiones en el enlazado implícito.