代码共享
当我们在大项目中使用 Xcode 时,不便之处之一是它不允许除了通过 .xcconfig 文件的构建设置之外重用项目元素。能够重用项目定义很有用,原因如下:
- 它简化了维护,因为更改可以应用在一处,所有项目会自动获取更改。
- 它使定义规范成为可能,新项目可以遵循这些规范。
- 项目更加一致,因此因不一致导致构建失败的可能性大大降低。
- 添加新项目变得简单,因为我们能够重用现有逻辑。
在 Tuist 中,跨清单文件重用代码得益于项目描述辅助模块的概念。
项目描述辅助模块
Section titled “项目描述辅助模块”项目描述辅助模块是编译成模块 ProjectDescriptionHelpers 的 Swift 文件,清单文件可以导入该模块。该模块通过收集 Tuist/ProjectDescriptionHelpers 目录中的所有文件进行编译。
你可以通过在文件顶部添加导入语句将它们导入到清单文件中:
import ProjectDescriptionimport ProjectDescriptionHelpersProjectDescriptionHelpers 在以下清单中可用:
Project.swiftPackage.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 ProjectDescriptionimport ProjectDescriptionHelpers
let project = Project.featureFramework(name: "MyFeature")