为什么?
Xcode 的配置文件虽然是纯文本,但正常人基本看不懂。也没有一个工具可以在不丢失任何信息的情况下把 project.pbxproj 解析成人类可读的格式。
最近开发 Flutter ,发现官方提供的 macOS 和 iOS 模版都是基于 Xcode 的,也就是说如果想要查看或修改构建配置,必须打开 Xcode ,这显然是可以接受的 (unacceptable)。
如何拒绝打开 Xcode
Xcodeproj 可以把 project.pbxproj 解析成 YAML 格式,在 Flutter 的 macOS 模版上试了下,构建相关的信息基本没丢。
但 Flutter 自身仍要借助 Xcode 来构建,所以只能看是不行的,必须有工具重新生成 project.pbxproj。
XcodeGen 虽然可以通过 YAML 生成 project.pbxproj,但它的 spec 跟 Xcodeproj 解析出来的 YAML 完全不同。
目前只能通过对照 Xcodeproj 解析出来的 YAML 和 XcodeGen 的 spec 人工完成。
示例
我花了两天时间把 Flutter macOS 模版里的 project.pbxproj 解析成了 YAML ,简单改改就能直接用了。
https://github.com/jat001/ddns4cdn-aio/blob/main/src/macos/project.yml
另外还有一份通过 Swift 调用 staic library (.a) 或 shared library (.so) 的示例,仍然无需打开 Xcode 就可编译。
https://github.com/jat001/ddns4cdn/tree/main/src/cgo/swift
这个项目其实是 Go 写的,通过 cgo 实现了用 C, C++, Objective-C 和 Swift 调用 Go 。当然,入参只有一个字符串,毕竟类型转换很麻烦,复杂的调用不如直接用目标语言重写。