CocoaPods 0.35 和 Molinillo

TL;DR:CocoaPods 0.35 已发布,依赖项解析过程有了重大改进,感谢 Stripe 的支持。0.35 版本得以发布,是因为同时发布了我们的新依赖项解析模块 Molinillo 0.1。

CocoaPods 0.35 的范围比 0.34 小得多,但此版本中的改进集中在 CocoaPods 的核心:依赖项管理器。新功能列表可能看起来很短,但不要失望:这对 CocoaPods 来说是向前迈出的重要一步。

依赖项解析

任何依赖项管理器的核心都是其 Resolver,其工作是获取依赖项列表(在 Podfile 中定义),并将这些显式要求转换为要安装的完整 Pod 集。使用 CocoaPods 0.35,核心依赖项解析代码已完全重写,从而诞生了 Molinillo,这是一个通用的依赖项解析模块。此更改应改善使用 CocoaPods 的体验,因为它能以更可预测的方式完成工作,并让你能够更多地关注自己的项目,而不是让 CocoaPods 变得更容易。

自动冲突解决

考虑以下 Podfile,请注意,当未指定版本要求时,CocoaPods 默认会尝试激活 Pod 的最新可用版本。(此示例中的版本基于撰写本文时所讨论的 Pod 的最新可用版本)。

pod 'AFAmazonS3Client' # Version 2.0.0 activates AFNetworking with: >= 2.0.0 && < 3.0.0
pod 'CargoBay'         # Version 2.1.0 activates AFNetworking with: >= 2.2.0 && < 3.0.0
pod 'AFOAuth2Client'   # Version 0.1.2 activates AFNetworking with: >= 1.3.0 && < 2.0.0

在 CocoaPods 的早期版本中,尝试 pod install 会产生一个错误,提示 无法满足以下要求,因为所有三个 Pod 的最新版本对不同版本的 AFNetworking 都有不兼容的依赖项。使用旧的解析器,我们会天真地尝试激活第一个依赖项的最新规范版本,然后继续,这会导致冲突,因为无法获取较旧版本的 AFNetworking(或依赖它的任何 Pod)。不再如此。通过过渡到 Molinillo,这是我在 Stripe 编写的一个通用的依赖项解析 gem,像这样的 Podfile 将自动解决此类冲突。

让我们在 CocoaPods 0.35 中查看相同的 Podfile

pod 'AFAmazonS3Client' # Version 1.0.1 activates AFNetworking with: >= 1.3.0 && < 2.0.0
pod 'CargoBay'         # Version 1.0.0 activates AFNetworking with: >= 1.0.0 && < 2.0.0
pod 'AFOAuth2Client'   # Version 0.1.2 activates AFNetworking with: >= 1.3.0 && < 2.0.0

从以上内容可以清楚地看出,AFAmazonS3ClientCargoBay 的最新版本与 AFOAuth2Client 的要求不兼容。因此,新的解析器现在将回溯并尝试通过寻找与 AFNetworking 1.3.0 到 2.0.0 之间的版本兼容的 AFAmazonS3ClientCargoBay较旧版本来满足 AFOAuth2Client 的要求,从而激活 AFNetworking 版本 1.3.4 并正确满足 Podfile 中的所有依赖项。

现在,当出现冲突时,解析器能够回溯,从而允许它同时满足所有依赖项约束,或明确指出 Podfile 无法解析。开发 与语言无关的解析器集成套件 使这成为可能,并有望确保其他依赖项管理器能够提供一致的解析过程。

改进锁定

CocoaPods 一直拥有版本锁定功能(即 Podfile.lock),它尝试确保每当有人克隆项目并运行 pod install 时,他们将获得与你相同的依赖项版本。在 CocoaPods 0.35 中,该版本锁定已扩展到隐式依赖项,因此你的 Podfile.lock 现在是绝对的真实来源。

预发布依赖项

在 CocoaPods,我们喜欢人们制作其库的预发布版本——我们自己也会这样做!为了更严格地符合 语义版本控制,Pod 的预发布版本现在仅在存在任何依赖项时才在解析过程中考虑,而该依赖项在其要求中具有预发布版本。

因此,如果你想要预发布版本(例如测试版),则必须在 Podfile 中指定,如下所示

pod 'AFNetworking', '~> 2.0.0-RC1'

外部源优化

此版本中优化并阐明了对外部源的依赖项的处理(例如,pod 'RestKit', git: 'https://github.com/RestKit/RestKit.git')。CocoaPods 现在只下载每个带有外部源的 Pod 一次,这有一个很好的副作用,即可以更快地列出具有大量子规范依赖项的规范。CocoaPods 还会在存在冲突的依赖项时通知你,这样你就可以从 Podfile 中删除不需要的重复项。最后,CocoaPods 会通知你是否使用不同的外部源指定了相同的 Pod,而不是选择一个随机源。

锁定检出选项

在改进的锁定和外部源优化交叉点上是 CocoaPods 0.35 的最终功能:锁定文件现在保存了必要的信息,以确保从存储库直接安装的依赖项将锁定到相同的修订版本,直到更新为止。这意味着此 Podfile 及其对应的 Podfile.lock 将确保团队中的每个成员始终使用所有依赖项的相同修订版本

pod 'AFNetworking', :git => 'https://github.com/AFNetworking/AFNetworking.git'
pod 'RestKit', :git => 'https://github.com/RestKit/RestKit.git', :branch => 'development'
pod 'ARAnalytics', '~> 2.9.0'

AFNetworking 将继续使用首次运行 pod install 时下载的相同提交,因此你不必担心在新的计算机上运行 pod install 时会潜入更改。与往常一样,pod update AFNetworking 将更新到最新提交。

性能改进

Molinillo 使解析普通应用程序的 Podfile 大约比旧解析器快 1.5 倍,鉴于其更广泛的功能集,这是令人惊讶的。此外,外部源优化应该使从外部源获取多个子规范快很多倍。

此版本的大多数性能改进来自 Eloy 在优化 Xcodeproj 中的昂贵操作方面的工作。这使得 CocoaPods 的集成步骤变得非常快!

额外新闻

我一直在致力于将 Molinillo 带到 Bundler,这样我们希望将来可以在依赖项解析实现中共享。

更新

要安装 CocoaPods 的最新版本,你可以运行

$ [sudo] gem install cocoapods

在版本 1.0 之前,我们强烈建议你保持 CocoaPods 为最新状态。

有关所有详细信息,请不要错过 变更日志