在没有 Xcode 的情况下制作 Cocoa App,例如:使用 VIM 进行编辑和 Swift 编译器
Posted
技术标签:
【中文标题】在没有 Xcode 的情况下制作 Cocoa App,例如:使用 VIM 进行编辑和 Swift 编译器【英文标题】:Making a Cocoa App without Xcode, eg: using VIM for editing and the Swift compiler 【发布时间】:2019-11-21 04:09:10 【问题描述】:这种类型的问题很多年前就提出了关于 Objective C 开发的问题,但我对 Swift 特别感兴趣。
目标:
使用 VIM 编写 Swift 源代码(使用 Swift 语法插件)并编译原生 cocoa App(bundle),类似于从 Xcode 创建一个简单的 cocoa 应用程序。
动机:
通过相当缓慢且有时不可靠的互联网连接下载了 8GB 的 Xcode 应用程序,再加上“正在更新时无法打开 Xcode”消息,这意味着我有几天时间致力于无 Xcode 的体验。
次要动机:
有时 Xcode 似乎在幕后执行隐藏的“魔法”,我总是打算深入探讨“Xcode 真正在做什么”与“应用程序中有多少是框架与 Xcode/Compiler 魔法”。
其中有许多子主题,例如:当我从各种来源下载旧示例项目时,Xcode 说 - 这个项目需要使用旧版本的 Xcode 迁移到新版本的 Swift您不再需要迁移它。然而,这些项目主要是源代码和资源,当我构建一个空项目并复制源代码和资源时,它们通常可以正常工作(一旦修复了一些语法错误),这让我很好奇这些破坏性的不兼容性是什么确实如此。
我决定调查此问题的一种方法是:
-
使用 VIM 编辑所有需要的文件
用程序生成的 UI 替换 xib/nib 文件(我对这部分很满意)
使用 Swift 编译器编译 cocoa 应用程序包,从而得出:
为 Xcode 项目创建的哪些文件与仅内部 Xcode 活动相关,哪些(以及哪些)成为编译器指令(以及如何)。
进展:
我创建了一个默认的 cocoa mac 应用程序,它显示一个空窗口。这将创建以下项目文件:
basicProject/basicProject/AppDelegate.swift
basicProject/basicProject/basicProject.entitlements
basicProject/basicProject/Info.plist
basicProject/basicProject/ViewController.swift
basicProject/basicProject/Assets.xcassets/Contents.json
basicProject/basicProject/Assets.xcassets/AppIcon.appiconset/Contents.json
basicProject/basicProject/Base.lproj/Main.storyboard
basicProject/basicProject.xcodeproj/project.pbxproj
basicProject/basicProject.xcodeproj/xcuserdata/username.xcuserdatad/xcschemes/xcschememanagement.plist
basicProject/basicProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata
basicProject/basicProject.xcodeproj/project.xcworkspace/xcuserdata/username.xcuserdatad/UserInterfaceState.xcuserstate
basicProject/basicProject.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
在构建目录的顶层,我有:
someXcodeWorkDirectory/scm.plist
someXcodeWorkDirectory/OpenQuickly-ReferencedFrameworks.index-v1
someXcodeWorkDirectory/Logs
someXcodeWorkDirectory/TextIndex
someXcodeWorkDirectory/Index
someXcodeWorkDirectory/Build
someXcodeWorkDirectory/info.plist
我没有将它们全部列出,因为这个单一的空窗口项目大约有 1,800 个文件。
举几个例子:
./Index/DataStore/v5/records/61/NSHTTPCookieStorage.h-SNU4K7QOIQ61
./Index/DataStore/v5/records/61/mach_voucher_types.h-ZENRRUWBXU61
./Index/DataStore/v5/records/XH/SCSITaskLib.h-2051VDYD45GXH
./Index/DataStore/v5/records/XH/SCSICmds_REPORT_LUNS_Definitions.h-2H7QJ9X9DMJXH
./Index/DataStore/v5/records/21/NSResponder.h-3G5XCM1YTXX21
./Index/DataStore/v5/records/4D/NSBezierPath.h-2W852T4P4GT4D
./Index/DataStore/v5/records/4D/IOHIDLibObsolete.h-38UUUALWPN94D
./Build/Intermediates.noindex/basicProject.build/Debug/basicProject.build/all-product-headers.yaml
./Build/Intermediates.noindex/basicProject.build/Debug/basicProject.build/basicProject-all-target-headers.hmap
./Build/Intermediates.noindex/basicProject.build/Debug/basicProject.build/basicProject.hmap
我在寻找什么:
对这 1,800 个文件的作用的一般解释,例如它们是 Xcode 生成的还是编译器/工具链生成的(例如:编译器是否生成这 1800 个文件,以及,广义地说,为什么生成 SCSICmds?) 任何指向适当参考的链接 任何类似努力的链接 关于如何接近/完成任务的任何指导/智慧/直觉。【问题讨论】:
【参考方案1】:一个好的资源是Building from the Command Line: Technical Note 2339。 Xcode 所做的一切都是在命令行上完成的,您可以通过“报告导航器”看到这一点。您应该首先遵循 Apple 的文档来使用 Xcode 构建应用程序,因为有很多东西要学习,Apple 会根据您将使用 Xcode 的假设来解释这一切。然后您可以在 Report Navigator 中检查 Xcode 的命令。例如,如果您不使用 Xcode 的自动签名,则 CodeSigning 会很复杂。这就是他们制作该功能的原因。如果您手动生成目标包,这将很棘手,您需要成为 CodeSigning 方面的专家才能正确处理。
我与您对彻底性的渴望有关,但我建议您重新审视自己的目标。例如,如果您想以编程方式生成 UI,那么只需通过您在 Xcode 项目中编写的代码来实现,不要使用 UI 构建器。如果你这样做是因为你想留在你喜欢的开发环境中,而不是学习 XCode,那么我认为它不会起作用。我认为 Xcode 应用程序命令行开发的主要用例是 devops 和构建测试工作,您需要在预先存在的企业构建/测试工具中运行事物。
也许最简单的方法是像其他人一样使用 Xcode,只需在您喜欢的编辑器中编辑 Swift/Objective-C/C/C++ 文件,然后使用 XCode 完成其余工作?用于 Swift 开发的最新和流行的 Vim 包似乎是 https://github.com/keith/swift.vim。还有一个插件可以让 Xcode 使用 Vim 键绑定,https://github.com/XVimProject/XVim2,尽管它是真正的 Vim 开发的一个发育不良的替代品。
【讨论】:
以上是关于在没有 Xcode 的情况下制作 Cocoa App,例如:使用 VIM 进行编辑和 Swift 编译器的主要内容,如果未能解决你的问题,请参考以下文章
在 Xcode 中制作 iPhone App 时,如何在手机不添加默认玻璃效果眩光的情况下制作 app 图标?