跳转到内容

代码共享

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

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

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

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

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

Project.swift
import ProjectDescription
import ProjectDescriptionHelpers

ProjectDescriptionHelpers 在以下清单中可用:

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

下面的代码片段包含一个示例,展示了如何扩展 Project 模型以添加静态构造函数,以及如何从 Project.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)]
)
]
)
}
}
import ProjectDescription
import ProjectDescriptionHelpers
let project = Project.featureFramework(name: "MyFeature")