制作没有 Xcode 的 Cocoa 应用程序,例如:使用 VIM 进行编辑和 Swift 编译器



这种类型的问题在很多年前就已经出现过,但我对 Swift 特别感兴趣。

目标:

使用

VIM 编写 Swift 源代码(使用 Swift 语法插件(并编译原生 cocoa App(捆绑包(,类似于从 Xcode 创建简单的 cocoa app。

赋予动机:

通过相当慢且有时不可靠的互联网连接下载 Xcode 应用程序的 8GB 下载,再加上"Xcode 在更新时无法打开"消息意味着我有几天的时间致力于无 Xcode 体验。

次要动机:

有时 Xcode 似乎在引擎盖下执行隐藏的"魔术",我一直打算深入研究"Xcode 到底在做什么"与"应用程序有多少是框架与 Xcode/编译器魔术"。

其中有许多子主题,例如:当我从各种来源下载较旧的示例项目时,Xcode 说 - 该项目需要迁移到较新版本的 Swift,使用较旧版本的 Xcode,您不再需要迁移它。然而,这些项目主要是源代码和资源,当我构建一个空项目并复制源代码和资源时,它们通常工作正常(一旦修复了一些语法错误(,这让我好奇这些破坏交易的不兼容性到底是什么。

我决定调查这个问题的一种方法是:

  1. 使用 VIM 编辑所有必需的文件
  2. 用编程生成的 UI 替换 xib/nib 文件(我对这部分感到满意(
  3. 使用 Swift 编译器编译可可应用程序包,从而找出:
  4. 为 Xcode
  5. 项目创建的哪些文件与内部仅 Xcode 活动相关,哪些(以及什么(成为编译器指令(以及如何(。

进展:

我创建了一个默认的可可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?
  • 指向相应参考的任何链接
  • 任何类似努力的链接
  • 关于如何处理/完成任务的任何指导/智慧/直觉。

一个很好的资源是从命令行构建:技术说明 2339。Xcode 所做的一切都是在命令行上完成的,您可以通过"报告导航器"查看。您应该首先按照Apple的文档使用Xcode构建应用程序,因为有很多东西需要学习,Apple从您将使用Xcode的假设中解释了这一切。然后,您可以在报表导航器中检查 Xcode 的命令。例如,如果您不使用 Xcode 的自动签名,代码签名会很复杂。这就是他们制作该功能的原因。如果您手动生成目标捆绑包,这将很棘手,您需要成为代码签名方面的专家才能正确处理。

我理解你对彻底的渴望,但我建议你重新审视你的目标。例如,如果您想以编程方式生成 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 开发的发育不良替代品。

最新更新