Ir al contenido

Compartir código

Uno de los inconvenientes de Xcode cuando lo usamos con proyectos grandes es que no permite reutilizar elementos de los proyectos aparte de la configuración de compilación a través de archivos .xcconfig. Poder reutilizar las definiciones del proyecto es útil por las siguientes razones:

  • Facilita el mantenimiento porque los cambios se pueden aplicar en un solo lugar y todos los proyectos reciben los cambios automáticamente.
  • Permite definir convenciones a las que los nuevos proyectos pueden ajustarse.
  • Los proyectos son más consistentes y, por lo tanto, la probabilidad de compilaciones fallidas debido a inconsistencias es significativamente menor.
  • Agregar nuevos proyectos se convierte en una tarea sencilla porque podemos reutilizar la lógica existente.

Reutilizar código entre archivos de manifiesto es posible en Tuist gracias al concepto de helpers de descripción de proyecto.

Un activo único de Tuist

A muchas organizaciones les gusta Tuist porque ven en los helpers de descripción de proyecto una plataforma para que los equipos de plataforma codifiquen sus propias convenciones y desarrollen su propio lenguaje para describir sus proyectos. Por ejemplo, los generadores de proyectos basados en YAML tienen que crear su propia solución de plantillas propietaria basada en YAML, u obligar a las organizaciones a construir sus herramientas sobre ella.

Helpers de descripción de proyecto#

Los helpers de descripción de proyecto son archivos Swift que se compilan en un módulo, ProjectDescriptionHelpers, que los archivos de manifiesto pueden importar. El módulo se compila reuniendo todos los archivos del directorio Tuist/ProjectDescriptionHelpers.

Puedes importarlos en tu archivo de manifiesto añadiendo una sentencia de importación al principio del archivo:

swift
// Project.swift
import ProjectDescription
import ProjectDescriptionHelpers

ProjectDescriptionHelpers están disponibles en los siguientes manifiestos:

  • Project.swift
  • Package.swift (solo detrás de la bandera de compilación #TUIST)
  • Workspace.swift

Ejemplo#

Los fragmentos siguientes contienen un ejemplo de cómo extendemos el modelo Project para añadir constructores estáticos y cómo los usamos desde un archivo Project.swift:

swift
import ProjectDescription
extension Project {
public static func featureFramework(name: String, dependencies: [TargetDependency] = []) -> Project {
return Project(
name: name,
targets: [
.target(
name: name,
destinations: .iOS,
product: .framework,
bundleId: "dev.tuist.\(name)",
infoPlist: "\(name).plist",
sources: ["Sources/\(name)/**"],
resources: ["Resources/\(name)/**",],
dependencies: dependencies
),
.target(
name: "\(name)Tests",
destinations: .iOS,
product: .unitTests,
bundleId: "dev.tuist.\(name)Tests",
infoPlist: "\(name)Tests.plist",
sources: ["Sources/\(name)Tests/**"],
resources: ["Resources/\(name)Tests/**",],
dependencies: [.target(name: name)]
)
]
)
}
}
Una herramienta para establecer convenciones

Observa cómo a través de la función estamos definiendo convenciones sobre el nombre de los targets, el identificador del bundle y la estructura de carpetas.