跳转到内容

插件

插件是跨多个项目共享和重用 Tuist 产物的一种工具。支持以下产物:

  • 跨多个项目的项目描述辅助模块
  • 跨多个项目的模板
  • 跨多个项目的任务。
  • 跨多个项目的资源访问器模板。

请注意,插件旨在成为扩展 Tuist 功能的简单方式。因此,有一些限制需要考虑

  • 插件不能依赖另一个插件。
  • 插件不能依赖第三方 Swift 包。
  • 插件不能使用使用该插件的项目中的项目描述辅助模块。

如果你需要更多灵活性,建议为工具提出功能请求,或在 Tuist 的生成框架 TuistGenerator 之上构建自己的解决方案。

项目描述辅助模块插件 {#project-description-helper-plugin}

Section titled “项目描述辅助模块插件 {#project-description-helper-plugin}”

项目描述辅助模块插件由一个目录表示,该目录包含一个声明插件名称的 Plugin.swift 清单文件和一个包含辅助 Swift 文件的 ProjectDescriptionHelpers 目录。

::: code-group

Terminal window
import ProjectDescription
let plugin = Plugin(name: "MyPlugin")
Terminal window
.
├── ...
├── Plugin.swift
├── ProjectDescriptionHelpers
└── ...

:::

资源访问器模板插件 {#resource-accessor-templates-plugin}

Section titled “资源访问器模板插件 {#resource-accessor-templates-plugin}”

如果你需要共享合成的资源访问器,可以使用这种插件类型。该插件由一个目录表示,该目录包含一个声明插件名称的 Plugin.swift 清单文件和一个包含资源访问器模板文件的 ResourceSynthesizers 目录。

::: code-group

Terminal window
import ProjectDescription
let plugin = Plugin(name: "MyPlugin")
Terminal window
.
├── ...
├── Plugin.swift
├── ResourceSynthesizers
├───── Strings.stencil
├───── Plists.stencil
├───── CustomTemplate.stencil
└── ...

:::

模板名称是资源类型的驼峰命名版本:

资源类型模板文件名
StringsStrings.stencil
AssetsAssets.stencil
Property ListsPlists.stencil
FontsFonts.stencil
Core DataCoreData.stencil
Interface BuilderInterfaceBuilder.stencil
JSONJSON.stencil
YAMLYAML.stencil

在项目中定义资源合成器时,你可以指定插件名称以使用插件中的模板:

let project = Project(resourceSynthesizers: [.strings(plugin: "MyPlugin")])

任务插件 {#task-plugin-badge-typewarning-textdeprecated-}

Section titled “任务插件 {#task-plugin-badge-typewarning-textdeprecated-}”

::: warning 已弃用 任务插件已弃用。如果你正在为项目寻找自动化解决方案,请查看这篇博客文章。 :::

任务是 $PATH 可执行的可执行文件,如果它们遵循命名约定 tuist-<task-name>,可以通过 tuist 命令调用。在早期版本中,Tuist 在 tuist plugin 下提供了一些弱约定和工具,用于 buildruntestarchive 表示为 Swift 包中的可执行文件的任务,但我们已弃用此功能,因为它增加了工具的维护负担和复杂性。

如果你曾使用 Tuist 分发任务,我们建议构建你的

  • 你可以继续使用随每个 Tuist 版本分发的 ProjectAutomation.xcframework 来通过 let graph = try Tuist.graph() 从你的逻辑中访问项目图。该命令使用系统进程运行 tuist 命令,并返回项目图的内存表示。
  • 为了分发任务,我们建议在 GitHub releases 中包含支持 arm64x86_64 的 fat 二进制文件,并使用 Mise 作为安装工具。为了指示 Mise 如何安装你的工具,你需要一个插件仓库。你可以使用 Tuist 的作为参考。
  • 如果你将工具命名为 tuist-{xxx},用户可以通过运行 mise install 安装它,他们可以直接调用它,也可以通过 tuist xxx 调用。

::: info PROJECTAUTOMATION 的未来 我们计划将 ProjectAutomationXcodeGraph 的模型整合到一个向后兼容的框架中,向用户公开整个项目图。此外,我们将把生成逻辑提取到一个新层 XcodeGraph 中,你也可以从自己的 CLI 中使用它。想象一下构建你自己的 Tuist。 :::

要使用插件,你需要将其添加到项目的 Tuist.swift 清单文件中:

import ProjectDescription
let tuist = Tuist(
project: .tuist(plugins: [
.local(path: "/Plugins/MyPlugin")
])
)

如果你想跨不同仓库中的项目重用插件,你可以将插件推送到 Git 仓库并在 Tuist.swift 文件中引用它:

import ProjectDescription
let tuist = Tuist(
project: .tuist(plugins: [
.git(url: "https://url/to/plugin.git", tag: "1.0.0"),
.git(url: "https://url/to/plugin.git", sha: "e34c5ba")
])
)

添加插件后,tuist install 会将插件获取到全局缓存目录。

::: info 无版本解析 正如你可能注意到的,我们不提供插件的版本解析。我们建议使用 Git 标签或 SHA 来确保可重现性。 :::

::: tip 项目描述辅助模块插件 使用项目描述辅助模块插件时,包含辅助模块的名称就是插件的名称

import ProjectDescription
import MyTuistPlugin
let project = Project.app(name: "MyCoolApp", platform: .iOS)

:::