跳到内容

模板

在已有明确架构的项目中,开发者可能希望引导生成与项目保持一致的新组件或功能。使用 tuist scaffold 可以从模板生成文件。你可以定义自己的模板,也可以使用 Tuist 内置的模板。以下是一些适合使用脚手架的场景:

  • 创建遵循指定架构的新功能:tuist scaffold viper --name MyFeature。
  • 创建新项目:tuist scaffold feature-project --name Home
非强制约定

Tuist 不对模板的内容及其用途施加任何强制约定。唯一的要求是将它们放在特定目录中。

定义模板#

要定义模板,可以运行 tuist edit,然后在 Tuist/Templates 下创建一个名为 name_of_template 的目录来表示你的模板。模板需要一个清单文件 name_of_template.swift 来描述模板。因此,如果你要创建一个名为 framework 的模板,应该在 Tuist/Templates 处创建一个新目录 framework,并在其中放置一个名为 framework.swift 的清单文件,示例如下:

swift
import ProjectDescription
let nameAttribute: Template.Attribute = .required("name")
let template = Template(
description: "Custom template",
attributes: [
nameAttribute,
.optional("platform", default: "ios"),
],
items: [
.string(
path: "Project.swift",
contents: "My template contents of name \(nameAttribute)"
),
.file(
path: "generated/Up.swift",
templatePath: "generate.stencil"
),
.directory(
path: "destinationFolder",
sourcePath: "sourceFolder"
),
]
)

使用模板#

定义模板后,可以通过 scaffold 命令使用它:

bash
tuist scaffold name_of_template --name Name --platform macos
Note

由于 platform 是可选参数,我们也可以在不带 --platform macos 参数的情况下调用该命令。

如果 .string 和 .files 提供的灵活性不足,你可以通过 .file 情形借助 Stencil 模板语言。此外,你还可以使用此处定义的额外过滤器。

使用字符串插值时,上面的 \(nameAttribute) 会被解析为 {{ name }}。如果你希望在模板定义中使用 Stencil 过滤器,可以手动编写该插值并添加任意过滤器。例如,你可以使用 { { name | lowercase } } 而不是 \(nameAttribute) 来获取 name 属性的小写值。

你还可以使用 .directory,它支持将整个文件夹复制到指定路径。

ProjectDescription 辅助工具

模板支持使用 ProjectDescription 辅助工具,以便在多个模板之间复用代码。