跳转到内容

代码共享

当我们在大项目中使用 Xcode 时,不便之处之一是它不允许除了通过 .xcconfig 文件的构建设置之外重用项目元素。能够重用项目定义很有用,原因如下:

  • 它简化了维护,因为更改可以应用在一处,所有项目会自动获取更改。
  • 它使定义规范成为可能,新项目可以遵循这些规范。
  • 项目更加一致,因此因不一致导致构建失败的可能性大大降低。
  • 添加新项目变得简单,因为我们能够重用现有逻辑。

在 Tuist 中,跨清单文件重用代码得益于项目描述辅助模块的概念。

::: tip TUIST 独有的优势 许多组织喜欢 Tuist,因为他们将项目描述辅助模块视为平台团队将自己的规范编纂并提出自己项目描述语言的平台。例如,基于 YAML 的项目生成器必须想出自己基于 YAML 的专有模板解决方案,或者强制组织在其上构建工具。 :::

项目描述辅助模块 {#project-description-helpers}

Section titled “项目描述辅助模块 {#project-description-helpers}”

项目描述辅助模块是编译成模块 ProjectDescriptionHelpers 的 Swift 文件,清单文件可以导入该模块。该模块通过收集 Tuist/ProjectDescriptionHelpers 目录中的所有文件进行编译。

你可以通过在文件顶部添加导入语句将它们导入到清单文件中:

Project.swift
import ProjectDescription
import ProjectDescriptionHelpers

ProjectDescriptionHelpers 在以下清单中可用:

  • Project.swift
  • Package.swift(仅在 #TUIST 编译器标志后)
  • Workspace.swift

下面的代码片段包含一个示例,展示了如何扩展 Project 模型以添加静态构造函数,以及如何从 Project.swift 文件中使用它们:

::: code-group

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)]
)
]
)
}
}
import ProjectDescription
import ProjectDescriptionHelpers
let project = Project.featureFramework(name: "MyFeature")

:::

::: tip 建立规范的工具 注意我们如何通过函数定义关于 target 名称、bundle 标识符和文件夹结构的规范。 :::