用途
该技能用于指导在 Tuist 生成的 Xcode 工作区中进行日常开发工作,包括项目生成、构建与测试命令,以及可构建文件夹(buildable folders)的使用。适用于在 Tuist 生成的项目中工作时,帮助开发者正确执行相关命令并遵循项目定义与工作流规范。
主要能力
快速开始
在不打开 Xcode 的情况下生成工作区:
tuist generate --no-open
使用 xcodebuild 构建 scheme:
xcodebuild build -workspace App.xcworkspace -scheme App
使用 xcodebuild 运行测试:
xcodebuild test -workspace App.xcworkspace -scheme AppTests -only-testing AppTests/MyTestCase
项目定义
优先使用可构建文件夹
使用 buildableFolders 代替 sources 和 resources 通配符。可构建文件夹与文件系统保持同步,因此添加或删除文件无需重新生成。
let target = Target(
name: "App",
buildableFolders: [
"App/Sources",
"App/Resources",
]
)
为 target 打标签以便聚焦
使用 target 标签对项目区域进行分组,例如:
tag:team:* tag:feature:* tag:layer:*
这些标签便于后续限定生成和测试范围。
带标签的 target 元数据示例:
let target = Target(
name: "PaymentsUI",
metadata: .metadata(tags: [
"tag:team:commerce",
"tag:feature:payments",
"tag:layer:ui",
])
)
在聚焦某个区域时,只生成所需内容:
tuist generate tag:feature:payments
tuist generate PaymentsUI PaymentsTests
对齐构建配置
保持项目与外部依赖之间的构建配置一致。使用 PackageSettings(settings: .settings(configurations: [])) 镜像项目配置;不匹配时会发出警告。
使用方式
工作流
有意识地生成
在自动化和脚本中使用 tuist generate --no-open,避免启动 Xcode。
当任何 manifest 发生变化(或依赖图变化)时重新生成。
如果因缺少产物导致生成失败,运行 tuist install 解析依赖后重试。
使用 xcodebuild 构建
针对生成的工作区和 scheme 使用 xcodebuild build。
xcodebuild build \
-workspace App.xcworkspace \
-scheme App \
-destination "generic/platform=iOS Simulator"
使用 xcodebuild 测试
在本地运行测试时使用 xcodebuild test。优先使用它而非 tuist test,因为 tuist test 每次调用都会重新生成项目,从而拖慢迭代速度。
优化测试运行时间:
- 使用 --only-testing 只运行你正在处理的特定测试套件或测试用例,而不是整个 target。
- 选择编译目标最少但仍包含所需测试 target 的 scheme。这能最小化测试运行前的构建时间。
# 运行特定测试套件
xcodebuild test \
-workspace App.xcworkspace \
-scheme AppTests \
-only-testing AppTests/MyTestSuite
# 运行单个测试用例
xcodebuild test \
-workspace App.xcworkspace \
-scheme AppTests \
-only-testing AppTests/MyTestSuite/testMyFunction
指南
- 保持 buildableFolders 路径与 target 的真实文件系统布局一致。
- 避免在同一 target 中让 buildableFolders 与 sources 或 resources 通配符重叠。
- 在运行 tuist generate --no-open 后,需要时手动打开 Xcode。
适用场景
适用于在 Tuist 生成的 Xcode 工作区中进行日常开发,包括项目生成、构建、测试以及项目定义维护。特别适合需要聚焦特定功能区域、优化测试运行时间,或在自动化脚本中生成项目的场景。
限制
故障排除
静态副作用警告:有意识地调整产物类型。对本地 target 使用 Target.product,对外部产物使用 PackageSettings(productTypes:)。将所有内容设为动态的 .framework 可以编译和运行,但可能损害启动时间。尽可能优先使用静态产物(静态框架或库),且不引入副作用时。
Objective-C 依赖崩溃:根据需要,在消费 target 上通过 OTHER_LDFLAGS 添加 -ObjC 或 -force_load。参考:https://tuist.dev/en/docs/guides/features/projects/dependencies#objectivec-dependencies。