内容提要
Xcode 27.2 以 project.xcproj 取代 project.pbxproj,将工程构建图从扁平 ID 表改为接近 UI 结构的 JSON 树,以减少 diff 与合并冲突,并降低 Agent 修改门槛。旧工程不自动转换,新旧格式并存,scheme、xcuserdata 等不变。它不取代 Tuist、XcodeGen 等工具,只是让工程文件更可读,但尚未成为可手写 review 的工程清单。
延伸解读
xcproj 的定位:表达方式升级,而非工程模型革命
project.xcproj 只是替换 .xcodeproj 包中的构建图文件,不改变工程模型本身。scheme、Package.resolved、xcuserdata 等均不受影响,旧工程也不会自动转换。它并非新的工程 DSL,也不取代 Tuist、XcodeGen 等生成工具。对开发者而言,这更像是一次文本表达方式的现代化,而非工程管理方式的根本变革。
从扁平 ID 表到树形结构:diff 与合并冲突的改善
pbxproj 使用扁平字典和 24 位十六进制 ID 交叉引用,导致多人协作时 diff 分散、合并冲突频繁。xcproj 改为接近 UI 结构的 JSON 树,按 files、targets、build-settings 等组织,并用名称和路径替代部分 ID 引用。例如文件通过 target-membership 声明归属,添加文件不再需要同时修改多处。这使 diff 更贴近实际界面操作,减少无关冲突。
对现有工具链的影响:适配而非替代
xcproj 不改变 .xcodeproj 的基本角色,因此 Tuist、XcodeGen、Bazel 等工具的工作流不变,只需逐步适配新格式。xcconfig 和 Synchronized folder 继续有效,并与新格式互补。对于直接维护 .xcodeproj 的独立开发者或小团队,收益最直接;已使用生成工具的团队可等待工具链适配,原有开发逻辑不会发生根本变化。
进步但非革命:工程清单的期待仍未实现
xcproj 解决了 pbxproj 在协作和 Agent 修改上的痛点,但苹果仍倾向于让工具维护工程描述,而非提供可手写、可 review 的公开接口。社区长期期待的类似 Package.swift 的工程清单并未出现。xcproj 更像是把旧轨道修得能跑 Agent,而非换一条轨道。不过,Folder 和 JSON 两步之后,真正面向开发者的工程清单已不再遥远。
Q&A
Xcode 27.2 中 project.xcproj 是什么?它替代了什么?
project.xcproj 是 Xcode 27.2 引入的新工程构建图格式,用于替代 .xcodeproj 包中的 project.pbxproj 文件。它采用 JSON 格式,将原本扁平的 ID 表改为更接近 UI 结构的树形结构,旨在让 diff 更易理解、减少合并冲突,并降低 Agent 修改门槛。
project.pbxproj 格式存在哪些主要问题?
pbxproj 使用源自 NeXTSTEP 时代的 OpenStep/ASCII plist 格式,以扁平字典存储所有对象,通过 24 位十六进制 ID 交叉引用。这导致多人协作时 diff 难以理解、合并冲突频繁,因为小改动可能影响多个不相邻位置,且顺序无意义的数组也容易引发冲突。对 Agent 而言,修改工程需在扁平表中定位对象并同步多处引用,耗时在模仿文本格式而非理解工程模型。
project.xcproj 相比 pbxproj 在结构上有哪些具体变化?
xcproj 从扁平 ID 表变为接近 UI 结构的树,按 files/targets/build-settings 等展开;调整关系描述方向,文件通过 target-membership 声明所属 target,添加文件不再需修改多处引用;ID 仍存在但交叉引用更多使用名称和路径,日常 diff 中不再充斥难懂的 ID。
如何将现有的 pbxproj 工程转换为 xcproj 格式?
旧工程不会自动转换,但可以在 Xcode 的 File inspector → Project Format 中选择 JSON,或使用命令行:xcodebuild -project MyApp.xcodeproj -convert-project "Xcode Project"。Xcode 27.2 同时支持新旧格式。
xcproj 会取代 Tuist、XcodeGen 等工程生成工具吗?
不会。xcproj 只是替换了 .xcodeproj 包中构建图的表达方式,并不改变 .xcodeproj 的基本角色,也不会取代 Tuist、XcodeGen 这类工程清单。生成器继续生成工程,修改工程的工具继续修改工程,只需根据自身需求逐步适配新格式。
xcproj 是苹果为开发者提供的可手写工程清单吗?
不是。xcproj 更像是把旧轨道修得能够跑 Agent,而不是换了一条轨道。它让工程文件更可读,但尚未成为可手写 review 的工程清单。苹果仍倾向于让工具维护工程描述,而不是把它变成开发者直接编写的公开接口。