CocoaPods 0.38 - watchOS 和目标去重

TL;DR:CocoaPods 0.38 已发布,它支持 watchOS 2、目标去重,并且为每个人提供统计信息。

CocoaPods 0.38 已发布。这是自 WWDC 以来我们的首次更新,它为 Apple 的最新版本(包括 Xcode 7 和 watchOS)提供了支持。它还包含了许多改进,使构建 Pod 变得更加容易。此外,它为每个人推出了统计信息

watchOS

此更新允许您将 Pod 与 watchOS 一起使用。作为 Pod 作者,您必须在 Podspec 中指定 watchOS 的部署目标,如下所示

Pod::Spec.new do |s|
  # …
  s.watchos.deployment_target = '2.0'
end

这在实践中意味着并非所有 Pod 都自动默认可用。任何可以支持 watchOS 的 Pod 都需要通过添加 s.watchos.deployment_target 来明确添加支持。这是一个全新的平台。

目标去重

CocoaPods 现在对 Pod 目标进行去重,这意味着它可以识别何时在不同的用户目标中多次使用依赖项,但只需要构建一次。但有时这是不可能的,它们仍然需要以不同的变体生成,因此需要构建多次。当满足以下条件之一时,需要复制 Pods.xcodeproj 中的目标

  • 它们在不同的平台上使用。
  • 它们与不同的子规范集一起使用。
  • 它们有任何需要复制的依赖项。

这修复了使用扩展归档应用程序的几个问题,但也显著减少了构建时间。

删除环境头

在集成中更新并运行 pod install 后,您会看到 Pods 目录中的一些头文件将不再生成,与模式 Pods-*-environment.h 匹配。这是环境头文件,其中包含集成目标中使用的每个依赖项的版本组件的预编译器宏定义。它不仅对用户目标可见,而且对所有依赖项都可见。如果存在给定的 pod,则可用于提供其他功能。但这也是一些问题的原因。其中之一是无法对框架进行重复数据删除。如果您依赖于此,您仍然可以使用 Clang 文件检查宏 __has_include 通过(头文件的存在)确定特定依赖项是否可用

#if __has_include(<QueryKit/QueryKit.h>)
  #import <QueryKit/QueryKit.h>
#endif

要在 Pod 中提供可选行为,您应使用 子规范,从 default_subspecs 中排除子规范,并在其中声明显式依赖项,该依赖项已版本化,并且仅当用户明确包含子规范时才会影响依赖项解析。

对 Hooks-API 的重大更改

Podfile 允许您定义 pre_installpost_install 钩子。在此更新之前,我们维护了一个代理层,以便我们可以更改安装/集成过程和模型,并仅更改 Hooks API 表示访问这些工件的方式。这工作了一段时间,但最终我们意识到我们已经完全不同步。因此,我们放弃了这种方法,并直接提供了底层安装程序,该安装程序之前已经公开,并为这种更高级的功能提供了更多高级的可能性。

如果您依赖于该功能,此表可以帮助您进行映射并为您提供一些迁移帮助

InstallerRepresentation Installer
sandbox_root sandbox.root
project pods_project
pods ~> pod_targets
libraries ~> aggregate_targets
specs_by_lib pod_targets 上使用 #find#select
pods_by_lib aggregate_targets 上使用 #find#select
sandbox sandbox
config config
installer 不需要

另请参阅 Installer 的 gem API 文档

如果您需要保持与 CocoaPods 旧版本的兼容性,那么您可以简单地检查 Podfile 中的 gem 版本,因为它毕竟只是 Ruby 代码。

post_install do |installer_or_rep|
  # @note: Remove after CocoaPods 0.38+ is completely rolled out
  # and rename block argument to `installer`.
  installer = installer_or_rep.respond_to?(:installer) ? installer_or_rep.installer : installer_or_rep

  # You can use the installer from now on.
end

xcconfig 的拆分

Podspec 中更高级的属性之一是 - 或者更确切地说 - 属性 xcconfig

这允许您为 Pod 指定构建设置。以前,这些设置可供库和集成目标使用。

我们通过对框架的支持打破了这一点。对于大多数 Pod 来说,这不是问题,因为构建设置主要用于配置仅与生成的 Pod 目标本身相关的构建设置。当我们提到由于该更改,仍有一些 Pod 不再按预期工作时,我们决定从现在开始拆分该属性。这样,Pod 也不会意外覆盖或与用户目标的构建设置冲突。

以前的属性 xcconfig 已弃用,并且在将新版本推送到 trunk 时会导致 linter 错误。新属性可用作 pod_target_xcconfiguser_target_xcconfig,这使得它们的效果更加清晰。后一个属性 (user_target_xcconfig) 应谨慎使用,因为设计良好的 Pod 应该是自包含的,并且对其环境的假设尽可能少。此外,当两个 Pod 为不允许多个值的构建设置指定不同的值时,此属性会导致冲突,因此无法合并。

Xcodeproj 中的确定性 UUID

此更新还包括最新版本的 Xcodeproj,它封装了 Xcode 项目的 API。除了支持新的构建设置外,它现在还支持为项目文件中的每个对象生成确定性 UUID。在实践中,这意味着在运行 pod installpod update 后,Pods.xcodeproj 的 diff 会更小,从而减少不必要的合并冲突。此行为可以通过新的 COCOAPODS_DISABLE_DETERMINISTIC_UUIDS 环境变量禁用。

解析器考虑了部署目标

现在在依赖项解析过程中考虑了 podspec 的部署目标。这将确保 CocoaPods 始终能够解析您的 Podfile,即使发布了具有更高最低部署目标的较新版本的 pod。它使 CocoaPods 整体的行为不太令人惊讶。

感谢错误修复的贡献者

除了这些增强功能外,0.38 还修复了数十个错误。特别感谢所有为本版本做出贡献的新贡献者,特别是他们在消除错误方面的帮助。

更新

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

$ [sudo] gem install cocoapods

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

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