Caché de módulos
::: advertencia REQUISITOS
- 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:
bash
tuist cacheEl 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:
::: grupo de códigos
bash
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 allbash
tuist test:::
::: advertencia
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:
bash
# 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 nonePrecedencia 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.
UPSTREAM DEPENDENCIES
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 susproyectos 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.
CACHE WARMING USES BINARIES
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:
bash
# 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 generateEsto 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 ocurrirsi 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 prevenirregresiones en el enlazado implícito.
