阅读 2542

CocoaPods 1.9 新特性

CocoaPods 1.9 增加了对 XCFrameworks 的支持,服务于 Pod 发布者的基于配置的依赖关系,所生成方案的代码覆盖率,以及其他增强功能和错误修复!

除了重要的错误修复之外,此版本还包括多项功能强化。

XCFramework 支持

随着 Xcode 11 的发布,Apple 引入了使用 .xcframework 文件扩展名的新 bundle 格式。这种格式允许将为不同架构和平台编译的框架的多个副本组合为单个结构。二进制依赖项还需要 XCFrameworks,以支持 macOS Catalina 中引入的新 Catalyst 平台。

此版本引入了让 Pod 发布者使用现有的 vendored_framework DSL 来支持 XCFrameworks 的方法。例如:

Pod::Spec.new do |s|
  s.name         = 'ToastLib'
  s.version      = '1.0.0'

  # ...rest of attributes here

  s.vendored_frameworks = 'ButterLib.xcframework'
end
复制代码

对于包含动态框架的 Pod 的应用程序,将在项目中添加一个名称为 [CP] Prepare Artifacts 的新脚本阶段,以方便将 .xcframework 包含在应用程序包中。

有关如何创建 XCFramework 的更多详细信息,请查看 Apple 的 WWDC 演讲 Binary Frameworks in Swift

Podspec 的基于配置的依赖关系

CocoaPods 长期以来一直支持在配置文件中排除一些依赖项。例如,对于只在开发调试期间使用的依赖,可以使用 pod Podfile DSL 上的 :configurations 选项来设置:

target 'BananaApp' do
  pod 'Toast', :configurations => ['Debug']
end
复制代码

新版本将该功能扩展到 Pod 发布者。 相同的 :configurations 选项现在可以与 dependency Podspec DSL一起使用:

Pod::Spec.new do |s|
  s.name         = 'ToastLib'
  s.version      = '1.0.0'

  # ...rest of attributes here

  s.dependency 'ButterDebugging', :configurations => ['Debug']
  s.dependency 'ErrorReportingTool', :configurations => ['Release']
end
复制代码

注意:当前仅支持 Debug 和 Release 配置。将来可能会添加对自定义配置名称的支持。

测试规范中的代码覆盖率

CocoaPods 在 1.7 版中首次引入了配置为 Podspecs 生成的 Xcode 方案的功能。此版本通过在 scheme DSL 中指定 code_coverage 选项,增加了对启用代码覆盖率的支持:

Pod::Spec.new do |s|
  s.name         = 'Networking'
  s.version      = '1.0.0'

  # ...rest of attributes here

  s.test_spec 'Tests' do |test_spec|
    test_spec.scheme = {
      :code_coverage => true, :environment_variables => {'FOO' => 'BAR' }
    }
  end
end
复制代码

Swift 版本变体

着新的 Swift 版本发布,Pod 发布者可以通过使用 swift_versions Podspec DSL 增加对多个 Swift 版本进行编译的支持。

为了更好地支持此功能,Podfile DSL 在 1.7 中进行了更新,以允许用户使用 supports_swift_version DSL 指定其应用程序支持的 Swift 版本。

如果两个不同的 target 包含相同的依赖关系,但需要不同的 Swift 版本,则 CocoaPods 现在将为同一 Pod 创建多个不同的目标,以适应所使用的不同 Swift 版本。

如以下 Pod:

Pod::Spec.new do |s|
  s.name         = 'CannonPodder'
  s.version      = '1.0.0'

  # ...rest of attributes here

  s.swift_versions = ['4.0', '5.0']
end
复制代码

以及以下 Podfile:

target 'SampleApp' do
  supports_swift_version '< 5.0'
  pod 'CannonPodder'
end

target 'SecondApp' do
  supports_swift_version '>= 5.0'
  pod 'CannonPodder'
end
复制代码

将创建 CannonPodder 目标的两个不同版本。

这样可以确保为依赖于 Pod 的每个目标使用正确的 Swift 版本。

use_frameworks! 链接定制

iOS 8.0 引入了应用发布动态链接框架的功能。为此,CocoaPods 引入了use_frameworks! DSL,可以把所有 Pod 都编译为动态链接框架。框架没有任何固有的链接,但是 Swift 最初需要动态链接,以在 iOS 应用中使用。可以将静态链接库包装在 .framework bundle 中。

现在,Swift 支持静态链接,CocoaPods 扩展了此 DSL,以允许指定首选的链接类型。

use_frameworks! :linkage => :static
复制代码

这是向 CocoaPods 用户提供更多如何将 Pod 包装和链接到其相关二进制文件的控制权的第一步。有关更多详细信息,请查看 github.com/CocoaPods/C…

下一步计划

在将来的版本中,我们将继续扩展有关如何将 Pod 集成到项目中的自定义功能。可以阅读 github.com/CocoaPods/C… 以了解所有更新。