2016 年 10 月 19 日
关注 @benasher44TL;DR:CocoaPods 1.1.0 已发布,它改进了对扩展、框架和新 Swift 版本的支持,还支持 Xcode 8 并改进了错误处理。
CocoaPods 1.1.0 已发布!此版本改进了将扩展目标集成到项目中的功能,还支持 Apple 的最新产品:Xcode 8、新的扩展类型和最新的 iOS。对于那些使用扩展目标的人来说,这意味着更顺畅的 App Store 提交。对于 Xcode 8 和 iOS 10,此版本在构建项目和分发 pod 时支持新的 Swift 版本设置,还支持新的目标类型,如消息扩展和消息应用程序。最后,我们集成了一些新的错误恢复工具,以帮助你在使用 CocoaPods 时遇到意外错误,并且我们对pod install
进行了一些性能改进,以便在大型项目中运行它时使用。
扩展
此更新改进了对集成扩展和框架目标的支持。扩展目标与应用程序目标有点不同,因为它们需要一个宿主应用程序。对于 CocoaPods,这意味着pod install
必须找到扩展所属的任何宿主目标,以便在那里集成这些扩展目标的依赖项。这乍一看似乎违反直觉,因为 Xcode 可以将框架安装到扩展中,就像将它们安装到应用程序目标中一样。但是,当你将应用程序及其扩展提交到 App Store 时,你可能会收到以下一些回复
无效的包。‘MyApp.app/PlugIns/MyExtension.appex’中的包包含不允许的嵌套包。
和/或
无效的包。‘MyApp.app/PlugIns/MyExtension.appex’中的包包含不允许的文件框架。
事实证明,Apple 希望扩展在其宿主应用程序中安装其框架依赖项:在启动时,扩展会查看其宿主应用程序的包以查找它们需要的框架。CocoaPods 1.1.0 理解这一点,并将扩展目标的依赖项集成到正确的位置。
框架
框架的工作方式也差不多。框架的依赖项还必须与该框架一起安装到将使用该框架的任何目标中。有几种新的框架场景,CocoaPods 1.1.0 现在对此很注意。在下面的每个场景中,框架都列在 Podfile 中并有一些 pod
- 应用程序类型项目中的框架
- 应用程序类型项目中的框架,其中框架可能位于子项目(即 Xcode 项目中的 Xcode 项目)中
- 仅框架项目(用于进行框架开发)
在每种情况下,pod install
都会查看项目中每个非框架目标的“目标依赖项”构建阶段,以查找框架应集成到何处(扩展也是如此)。对于仅框架项目,如果 CocoaPods 可以判断项目仅包含框架目标,那么它会假定该项目必须是仅框架项目(用于进行框架开发),并对此假定发出警告。在这种情况下,CocoaPods 无需执行太多操作,只需确保项目的目标具有正确构建所需的标头即可。
Xcode 8 和 iOS 10
Xcode 8 已发布!它带来了对 iOS 10、macOS Sierra、新版本的 Swift 以及 CocoaPods 的新挑战的支持。第一个挑战是支持 Swift 2.3 和 3.0 项目。在 CocoaPods 1.1.0 中,在对 Pod 进行检查和推送时设置 Swift 版本的方式如下
- 如果 Pod 使用 Swift,它默认为 Swift 3.0。
- 如果存在,它会使用
.swift-version
文件中的设置(灵感来自 swiftenv)。 - 可以使用
--swift-version
标志来指定要使用的 Swift 版本。这会覆盖.swift-version
文件中设置的版本。
最后,iOS 10 提供了一些新的扩展和应用程序类型。特别是,CocoaPods 已更新为识别消息扩展和应用程序产品类型。
关于在 Podspec 中支持多个 Swift 版本
由于 Swift 不使用语义版本控制,因此在 Podspec 中支持 Pod 使用的 Swift 语言版本很棘手。我们考虑了一些不同的选项,但最终决定不为此次发布添加任何新的 Podspec DSL。以下是我们考虑的一些选项示例
我们可以添加
swift_version
选项来指示 Pod 支持的 Swift 版本。这将强制作者在推出新版本的 Swift 时推送 Pod 的新版本以更新此设置,即使新版本的 Swift 向后兼容。这不是理想的选择。这可以通过支持
min_swift_version
选项来帮助,以指示 pod 支持的最小 Swift 版本。这不会强制作者在新版本发布时更新其 pod,但如果发布了与用于构建 pod 的版本不向后兼容的新版本 Swift,则会中断。我们可以添加
swift_version_range
选项来指示 pod 支持的 Swift 版本范围,但这与选项 2 具有相同的问题。没有办法验证今天推送的声称支持 Swift 版本 4 的 pod 实际上是否支持该版本。
在此版本的 CocoaPods 中,您针对您打算支持的 Swift 版本对您的 pod 执行 lint。在集成 pod 时,CocoaPods 会生成使用项目中设置的 Swift 版本的 pod 目标。这允许 pod 作者通过使用 #if swift()
检查灵活地支持多个不兼容的 swift 版本,同时在 Swift 3 版本中保持 pod 维护负担较轻。
此外,用于通过验证的 Swift 版本已烘焙到 podspec JSON文件中,该文件被推送到 trunk。对于工具作者,这使得可以轻松使用 trunk 上的 pod 数据库来构建与多个 Swift 版本配合使用的可靠工具。
错误处理改进
现在,当 CocoaPods 收到意外错误时,它将在控制台中突出显示可能相关的现有问题。这使得更容易找到常见问题的答案。我们通过使用 gh_inspector 来实现这一点,您可能在 Fastlane 中也看到过。
CocoaPods 1.1.0 是一个巨大的版本,所以恭喜大家!查看 变更日志 以获取完整更改列表。