CocoaPods 1.3.0 — 测试规范和性能改进

TL;DR:CocoaPods 1.3.0 已发布,其中包括对测试规范的支持以及性能改进,具体涉及重建项目和准备支持 Xcode 9!

我们很高兴地宣布 CocoaPods 1.3.0 已发布!此版本的主要功能是对测试规范的支持。到目前为止,podspec 无法描述测试源,这使得测试 pod 变得困难,并且需要自定义解决方法才能通过其他方式表示测试源。通过此版本,您现在可以在 podspec 中描述测试源!

我们来看一个示例 podspec

Pod::Spec.new do |s|
  s.name         = 'CoconutLib'
  s.version      = '1.0'
  s.authors      = 'Coconut Corp', { 'Monkey Boy' => '[email protected]' }
  s.homepage     = 'http://coconut-corp.local/coconut-lib.html'
  s.summary      = 'Coconuts For the Win.'
  s.description  = 'All the Coconuts'
  s.source       = { :git => 'http://coconut-corp.local/coconut-lib.git', :tag => 'v1.0' }
  s.license      = {
    :type => 'MIT',
    :file => 'LICENSE',
    :text => 'Permission is hereby granted ...'
  }

  s.source_files = 'Sources/*.{h,m}'

  s.test_spec 'Tests' do |test_spec|
    test_spec.source_files = 'Tests/*.{h,m}'
    test_spec.dependency 'OCMock' # This dependency will only be linked with your tests.
  end  
end

测试规范的工作原理与子规范类似,但在集成时 CocoaPods 会以不同的方式处理它们。您指定的任何源和标头都将自动添加到测试目标中,并且在测试规范下指定的任何依赖项链接到测试目标。默认情况下,测试规范依赖于其父项,包括其所有传递依赖项,并且可以导入其所有标头(包括私有标头)进行测试。

注意:截至目前,测试规范将生成单元测试包,无需应用程序主机即可执行。在不久的将来会添加对具有应用程序主机的测试规范的支持。

如果存在任何测试规范,我们还更新了 lint 进程以自动构建和运行测试源。此功能默认开启,如果任何测试源无法编译或测试运行失败,lint 将失败。最后,已添加标志 --skip-tests,以便在 lint 期间跳过测试,如果您出于任何原因希望跳过运行测试。

如果您希望使用 pod 的测试,可能是用于本地开发,那么您必须在 Podfile 中指定测试规范。例如

 target 'MyApp' do
   use_frameworks!
   pod 'CoconutLib', '~> 1.0', :testspecs => ['Tests']
 end

当您执行 pod install 时,这将自动为名为 CoconutLib-Unit-TestsCoconutLib 创建一个测试目标。

注意:已向所有生成的 pod xcschemes 添加了对自动执行测试的支持。这意味着您现在可以在生成的 pod 目标上 CMD+U 以运行其测试,而无需手动创建或添加测试方案。

测试规范是 CocoaPods 的一项强大补充,允许你在 podspec 中表示你的测试源。这是让 podspec 成为描述你的库的真理之源的缺失部分之一。CocoaPods 在利用文件系统作为库组织的真理之源方面做得很好,现在它也适用于你的测试源。这也意味着你现在可以使用你的 CI 环境构建、测试和发布你的 pod,使用 lint 作为唯一的命令,从而让你免于手动管理 Xcode 项目。

性能改进

在此版本中,我们还解决了 CocoaPods 开发中一些最大的痛点。特别是,有三个主要更新来解决以下问题

  1. 所有 CocoaPods 脚本阶段(例如“嵌入 Pods 框架”和“复制 Pods 资源”)现在都利用 Xcode 的输入和输出路径。这意味着这些阶段不会再次执行,除非它们的任何输入或输出已更改。当你添加或删除 Podfile 中的 pod 时,这将由 CocoaPods 自动管理。对于经常通过进行单个文件更改并希望快速重建来进行迭代的开发人员来说,这应该节省大量时间。在内部,我们已经看到在不编辑单个源文件的情况下,完成重建需要 10-15 秒,但是,使用 CocoaPods 1.3.0,相同的过程现在只需不到一秒钟。

  2. 每次执行 pod install 时,CocoaPods 都会生成一些文件。这些文件对于 CocoaPods 正常运行并正确集成你的项目是必需的。但是,即使内容相同,通过重新生成这些文件,Xcode 也会将它们视为“脏”的,并经常从头开始重建你的项目。使用 CocoaPods 1.3.0 不再会出现这种情况。现在比较每个文件的内容,除非它已更改,否则不会重新编写文件。再次执行 pod install 不应导致任何未更改的 pod 重新构建。

  3. 我们已经应用了一些性能改进,以加快 pod install 时间。这对于具有多个目标和大量 pod 的大型复杂项目特别有益。保持 pod install 时间较低允许开发人员通过更快地生成他们的工作空间来更快地执行。

值得注意的增强功能

此版本还有一些其他值得注意的内容

  1. CocoaPods 将自动检测并复制已出售的动态框架的 .dSYM 文件。将 .dSYM 放置在 .framework 旁边,以便 CocoaPods 检测到它并将其复制到 ${DWARF_DSYM_FOLDER_PATH} 指定的文件夹中。

  2. 现在,每个 lint 执行都在一个唯一的临时文件夹中运行。这允许在并行环境中运行多个 lint 进程,例如在 CI 环境中。

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

Xcode 9

Apple 在发布 Xcode 9 方面进展迅速。我们已经注意到这一点,并且正在执行确保平稳过渡所需的所有必要步骤。我们还看到了一些新的主要功能,例如在静态库中包含 Swift 源的能力,并且正在寻求尽快支持这些功能。

CocoaPods 1.3.0 是 CocoaPods 的一个重要里程碑,因为它作为 iOS 依赖关系管理的标准库而日趋成熟。我们要感谢所有贡献者对改进此项目所提供的支持和时间!