原文鏈接:https://mp.weixin.qq.com/s/QaRTi8u_QSbYYGtc5HS4cA
CocoaPods 1.9 增加了對 XCFrameworks 的支持,服務于 Pod 發(fā)布者的基于配置的依賴關系,所生成方案的代碼覆蓋率,以及其他增強功能和錯誤修復!
除了重要的錯誤修復之外,此版本還包括多項功能強化。
XCFramework 支持
隨著 Xcode 11 的發(fā)布,Apple 引入了使用 .xcframework 文件擴展名的新 bundle 格式。這種格式允許將為不同架構和平臺編譯的框架的多個副本組合為單個結構。二進制依賴項還需要 XCFrameworks,以支持 macOS Catalina 中引入的新 Catalyst 平臺。此版本引入了讓 Pod 發(fā)布者使用現有的 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
對于包含動態(tài)框架的 Pod 的應用程序,將在項目中添加一個名稱為 [CP] Prepare Artifacts 的新腳本階段,以方便將 .xcframework包含在應用程序包中。有關如何創(chuàng)建 XCFramework 的更多詳細信息,請查看 Apple 的 WWDC 演講 Binary Frameworks in Swift。
Podspec 的基于配置的依賴關系
CocoaPods 長期以來一直支持在配置文件中排除一些依賴項。例如,對于只在開發(fā)調試期間使用的依賴,可以使用 pod Podfile DSL 上的 :configurations 選項來設置:
target 'BananaApp' do
pod 'Toast', :configurations => ['Debug']
end
新版本將該功能擴展到 Pod 發(fā)布者。相同的 :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 配置。將來可能會添加對自定義配置名稱的支持。
測試規(guī)范中的代碼覆蓋率
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 版本發(fā)布,Pod 發(fā)布者可以通過使用 swift_versions Podspec DSL 增加對多個 Swift 版本進行編譯的支持。為了更好地支持此功能,Podfile DSL 在 1.7 中進行了更新,以允許用戶使用 supports_swift_version DSL 指定其應用程序支持的 Swift 版本。如果兩個不同的 target 包含相同的依賴關系,但需要不同的 Swift 版本,則 CocoaPods 現在將為同一 Pod 創(chuàng)建多個不同的目標,以適應所使用的不同 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
將創(chuàng)建 CannonPodder 目標的兩個不同版本。這樣可以確保為依賴于 Pod 的每個目標使用正確的 Swift 版本。
use_frameworks! 鏈接定制
iOS 8.0 引入了應用發(fā)布動態(tài)鏈接框架的功能。為此,CocoaPods 引入了use_frameworks! DSL,可以把所有 Pod 都編譯為動態(tài)鏈接框架??蚣軟]有任何固有的鏈接,但是 Swift 最初需要動態(tài)鏈接,以在 iOS 應用中使用??梢詫㈧o態(tài)鏈接庫包裝在 .framework bundle 中。現在,Swift 支持靜態(tài)鏈接,CocoaPods 擴展了此 DSL,以允許指定首選的鏈接類型。
use_frameworks! :linkage => :static
這是向 CocoaPods 用戶提供更多如何將 Pod 包裝和鏈接到其相關二進制文件的控制權的第一步。有關更多詳細信息,請查看 https://github.com/CocoaPods/CocoaPods/issues/9099