让 Xcode 见鬼去

2023-10-30 06:13:17 +08:00
 Jat001

为什么?

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 。当然,入参只有一个字符串,毕竟类型转换很麻烦,复杂的调用不如直接用目标语言重写。

8317 次点击
所在节点    Xcode
45 条回复
chihiro2014
2023-10-30 11:09:50 +08:00
最近接了一单需要写 ios ,ios 的开发环境太逆天了…装了 macos12 黑苹果以及能支持的最高版本 xcode ,然后插上我的 13pro max 表示不兼容,插上我淘汰的 6s 和 5s 也不兼容。草,太逆天了妈的。
debuggerx
2023-10-30 11:36:09 +08:00
@luck66 你没懂我的意思,我当然感激和佩服维护三方库的人,我说的是因为“认知问题”而不用成熟三方库,而自己写“脆弱且不可维护的”原生桥接代码把项目搞得难以维护,还以自己“同时精通”跨平台和原生而沾沾自喜的人。

我接手过包括 Flutter 在内的很多项目,很多明明有成熟的第三方库可以用,但是之前写的人可能就是从不知道哪里复制来一段 just work 的代码,或者自己造了一个当时在他环境下可用的轮子,结果上线后发现很多用户的设备没考虑到出现各种问题,如果用的是成熟的三方库就很可能已经覆盖了这些设备差异;有时我们接手后随着系统更新各种出错不可用,如果是活跃的三方库可以通过升级依赖的方式快速解决,或者可以通过 issue 和别的开发者讨论找到方案。
Leonard
2023-10-30 11:45:52 +08:00
@chihiro2014 iOS 版本和 Xcode 版本绑定,Xcode 版本又和 macOS 版本绑定
CareiOS
2023-10-30 12:33:51 +08:00
了解一下 tuist
Jat001
2023-10-30 12:44:49 +08:00
@CareiOS
都说了 xcode 的配置文件不是人类可读的,也没有任何第三方工具可以解析

Can I generate the manifest files from my Xcode projects?

While we can generate Xcode projects from your manifest files, doing it the other way around is not possible. It's possible to implement such feature in Tuist, but since we wouldn't be able to do it reliably considering how Xcode projects can be, we opted for not doing it. Moreover, going through the process of defining the manifests helps you spot issues in your current projects that otherwise would go unnoticed.
shellcodecow
2023-10-30 14:59:12 +08:00
很难接受吗? .... 很难吗?
Jat001
2023-10-30 15:23:12 +08:00
@shellcodecow 无脑果粉?要是 android studio 不用 gradle 而是自己搞个封闭的构建工具不知道会被喷成啥样。不过也不奇怪,apple 自己连个从 cli 里安装 ios app 的工具都不愿意提供
zongren
2023-10-30 16:28:04 +08:00
那是不是把这两个项目 Xcodeproj 和 XcodeGen 修改一下,使用相同 yaml 格式,就可以摆脱人工修改 yaml 了
shellcodecow
2023-10-30 16:29:47 +08:00
@Jat001 #27 没经历过社会毒打才会傻 x 一件毫无意义的事情. 硬件不够的升级硬件, 有洁癖的洗手
dohaeris
2023-10-30 18:57:16 +08:00
然后未来某次 Xcode 升级之后你的 YAML 就不能用了[doge]
chihiro2014
2023-10-30 21:05:16 +08:00
我只能说只是什么傻逼逆天生态

@Leonard
Jat001
2023-10-31 02:21:11 +08:00
@zongren 不行,前面说了,没有任何一个工具可以在不丢失信息的情况下解析 xcode 的配置文件,这包括 Xcodeproj
Jat001
2023-10-31 02:23:31 +08:00
@shellcodecow 没经历过社会毒打才会傻 x 一样在网络上发些没有意义的风凉话,不喜欢就尝试去改变,只会抱怨解决不了问题
Jat001
2023-10-31 02:25:55 +08:00
@dohaeris 有这个可能,所以最好的办法还是摆脱 xcode 那套封闭的生态链
ostholz
2023-10-31 02:47:13 +08:00
为什么不用 Tuist
Jat001
2023-10-31 02:54:18 +08:00
@ostholz 25 楼有写
ostholz
2023-10-31 02:57:55 +08:00
@Jat001
sorry, 没看到那楼
IgniteWhite
2023-10-31 03:48:24 +08:00
@shellcodecow 你把人笑拥了我给你说。开发者要是都懒得做所有事,一切都遵从傻瓜配置,GitHub 不得倒闭了。
zeromake
2023-10-31 14:03:27 +08:00
实际上有很多工具可以跳过 xcode 直接编译应用了,但是到了 debug 还是得回到 xcode……
zongren
2023-10-31 14:30:43 +08:00
@zeromake debug 能不能直接调用后端?使用 vscode 作为前端?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/986552

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX