App 1.0

TLDR:CocoaPods 现在有一个 Mac App,它提供托管的 Ruby 体验,请访问其网页查看:cocoapods.org/app

本文的其余部分将介绍如何将所有部分组合在一起以制作 CocoaPods 应用程序。

幕后发生了什么?

我们来看看 Xcode 项目。

该应用程序是三个独立的工具,它们协同工作以提供无缝体验。你可以看到目标;CocoaPodspodReflectionService

CocoaPods

这是 CocoaPods 应用程序,它为使用 CocoaPods 的人提供常见的任务的 OS X GUI。它也是使用 CocoaPods 公开的 CocoaPods 功能所需的整个环境的主机。事实证明,一旦你尝试复制普通用户的环境,CocoaPods 就会有很多依赖项。

为了使其无缝工作,我们捆绑了:bzrcurlgitmercurialncursesopensslpkg-configrubysconsserfsubversionyamlzlib。这些是编译后的依赖项,位于应用程序包中。在上面的 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 中执行命令并将文本输出到 STDINSTERR。这使得运行命令变得容易,但处理交互性可能很困难。它实际上是一种单向通信模式。

有一些桥接 Ruby 和 Cocoa 的工具,最著名的是 RubyMotion。然而,有一个桥接过去随 Mac OS 一起提供。那就是 RubyCocoa。我们使用 RubyCocoa 构建了 Objective-C 和 Ruby 之间双向通信的支持。

有一段时间,我们有一个 RubyCocoa 分支,它 支持在 Swift 中创建的对象,但这可能会变成一条漫长的道路,而我们最终却收获甚微。

我们通过转向与 Ruby 通信 通过 XPC 来否定这种需求,我们称之为 ReflectionService。它在下面进行了说明。

XPC 意味着我们可以拥有一个持续运行的 Ruby 环境,从中我们可以发送/接收有关 Podfile 的元数据。这可以保护应用程序免于崩溃,保持内存使用率较低,并且不需要在每次我们想要进行通信时启动 Ruby。三赢。如果你还没有看过 XPC,它得到了我们的支持。

现在有什么?

1.0 的主要功能是能够编辑 Podfile,并且能够在其中运行 pod installpod update

我真正高兴的事情之一是 Podfile 的内联错误。该应用程序在你编辑 Podfile 时提供直接反馈

我们有很多正常的开发者按键命令按预期工作,如果你想要我们不支持的内容,请给我们写一个问题或 PR。

接下来是什么?

我们有一些 WIP Pull Requests,用于一些很酷的功能,如自动 CocoaPods 插件安装和集成摘要。这些功能很可能包含在最终的 1.0 版本中。但是,我们还没有尝试用这个应用程序展望远的未来。

我认为有很多改进空间,我们非常欢迎社区就 CocoaPods GUI 中希望看到的内容提供一些意见。

例如,我知道大多数人在尝试解决此问题时都会尝试解决 pod 发现问题,但我不知道我们能否在原生应用中做得比网站更好。非常希望看到一些关于我们如何改进的创意。