2016 年 1 月 12 日
关注 @ortaTLDR:CocoaPods 现在有一个 Mac App,它提供托管的 Ruby 体验,请访问其网页查看:cocoapods.org/app。
本文的其余部分将介绍如何将所有部分组合在一起以制作 CocoaPods 应用程序。
幕后发生了什么?
我们来看看 Xcode 项目。
该应用程序是三个独立的工具,它们协同工作以提供无缝体验。你可以看到目标;CocoaPods
、pod
和 ReflectionService
。
CocoaPods
这是 CocoaPods 应用程序,它为使用 CocoaPods 的人提供常见的任务的 OS X GUI。它也是使用 CocoaPods 公开的 CocoaPods 功能所需的整个环境的主机。事实证明,一旦你尝试复制普通用户的环境,CocoaPods 就会有很多依赖项。
为了使其无缝工作,我们捆绑了:bzr
、curl
、git
、mercurial
、ncurses
、openssl
、pkg-config
、ruby
、scons
、serf
、subversion
、yaml
和 zlib
。这些是编译后的依赖项,位于应用程序包中。在上面的 Xcode 项目中,它们包含在 bundle
引用组中。
这是其中的设置。它与 Xcode 托管其所有 SDK、编译器和应用程序(例如 Instruments.app、iOS Simulator.app)的方式非常相似。这些文件夹表示一个托管的环境,该环境经过充分包含和测试。我们在应用程序中提供了这些依赖项的最新稳定版本。
该应用程序的 GUI 方面主要使用 Swift 和 Objective-C(必要时)。它使用最新 Cocoa API 中提供的所有新潮现代功能:NSViewControllers、情节提要和 XPC。
它使用简单的组合进行干净地构建,并且一直是许多人的第一个开源贡献的来源。我们保留了一个储备充足的 问题柜,其中包含标记明确的问题,供想要提供帮助的人使用。我的目标是始终为功能提前提出设计,让人们可以轻松地根据规范进行贡献。
pod
我们不打算在 CocoaPods 应用程序中复制命令行 gem 的每个功能。那只是浪费我们的时间。相反,我们提供了一种使用 CocoaPods.app 中的 CocoaPods 版本访问命令行界面的方法。我们通过提供命令行工具以与 Xcode 相同的方式来实现此目的
pod
命令是一个 C binstub,它使用核心服务 API 来独立于安装它的 CocoaPods.app 工作。binstub 查找 RubyGems 生成的嵌入式 ruby pod
命令并传递相同的参数。这意味着一旦你安装了它,你就可以自由地移动你的应用程序,而我们不需要更新 C binstub。王牌。
由于它具有相同名称,因此安装后你无需更改任何脚本或终端中的开发流程。在过去几个月里,我一直在使用它作为我的主 pod
命令。
ReflectionService
CocoaPods 应用程序需要与 ruby 提供的 pod
命令通信。最简单的选项是通过 NSTask,它将在 shell 中执行命令并将文本输出到 STDIN
和 STERR
。这使得运行命令变得容易,但处理交互性可能很困难。它实际上是一种单向通信模式。
有一些桥接 Ruby 和 Cocoa 的工具,最著名的是 RubyMotion。然而,有一个桥接过去随 Mac OS 一起提供。那就是 RubyCocoa。我们使用 RubyCocoa 构建了 Objective-C 和 Ruby 之间双向通信的支持。
有一段时间,我们有一个 RubyCocoa 分支,它 支持在 Swift 中创建的对象,但这可能会变成一条漫长的道路,而我们最终却收获甚微。
我们通过转向与 Ruby 通信 通过 XPC 来否定这种需求,我们称之为 ReflectionService
。它在下面进行了说明。
XPC 意味着我们可以拥有一个持续运行的 Ruby 环境,从中我们可以发送/接收有关 Podfile 的元数据。这可以保护应用程序免于崩溃,保持内存使用率较低,并且不需要在每次我们想要进行通信时启动 Ruby。三赢。如果你还没有看过 XPC,它得到了我们的支持。
现在有什么?
1.0 的主要功能是能够编辑 Podfile,并且能够在其中运行 pod install
和 pod update
。
我真正高兴的事情之一是 Podfile 的内联错误。该应用程序在你编辑 Podfile 时提供直接反馈
我们有很多正常的开发者按键命令按预期工作,如果你想要我们不支持的内容,请给我们写一个问题或 PR。
接下来是什么?
我们有一些 WIP Pull Requests,用于一些很酷的功能,如自动 CocoaPods 插件安装和集成摘要。这些功能很可能包含在最终的 1.0 版本中。但是,我们还没有尝试用这个应用程序展望太远的未来。
我认为有很多改进空间,我们非常欢迎社区就 CocoaPods GUI 中希望看到的内容提供一些意见。
例如,我知道大多数人在尝试解决此问题时都会尝试解决 pod 发现问题,但我不知道我们能否在原生应用中做得比网站更好。非常希望看到一些关于我们如何改进的创意。