CocoaPods 1.9 Beta 版现已推出!

CocoaPods 1.9 添加了对 XCFrameworks 的支持、基于配置的 Pod 作者依赖项、生成方案中的代码覆盖率以及其他增强功能和错误修复!

此版本除了重要的错误修复外,还包含多项生活质量增强功能。

XCFramework 支持

随着 Xcode 11 的发布,Apple 引入了一种使用 .xcframework 文件扩展名的新捆绑格式。此格式允许将为不同架构和平台编译的框架的多个副本合并到单个结构中。二进制依赖项还需要 XCFramework 来支持 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 演讲 Swift 中的二进制框架,其中介绍了此格式。

Podspec 的基于配置的依赖项

CocoaPods 长期以来一直支持从不需要的配置中排除依赖项。例如,可以使用 pod Podfile DSL 上的 :configurations 选项包括开发期间使用的仅调试依赖项

target 'BananaApp' do
  pod 'Toast', :configurations => ['Debug']
end

此版本将此功能扩展到 Pod 作者。现在可以在 dependency Podspec DSL 中使用相同的 :configurations 选项

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

注意:目前仅支持 DebugRelease 配置。将来可能会添加指定自定义配置名称的支持。

测试规范中的代码覆盖率

CocoaPods 最初在 1.7 版本中引入了配置 Podspec 中生成的 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 版本。

如果两个不同的目标包含相同的依赖项但需要不同的 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 捆绑包中。

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

use_frameworks! :linkage => :static

这是向 CocoaPods 用户提供更多控制权的第一步,让他们可以控制 Pod 如何打包并链接到其依赖的二进制文件中。有关更多详细信息,请查看 RFC

接下来

在未来版本中,我们将继续扩展 Pod 如何集成到项目中的自定义点。

感谢所有帮助实现此版本的贡献者!

查看 变更日志 以查看完整更改列表。