CocoaPods 1.9 新特性

Eric Amorde· 2019-12-31
本文來自 知識小集 ,作者 Eric Amorde

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 目標的兩個不同版本。

image.png

這樣可以確保為依賴于 Pod 的每個目標使用正確的 Swift 版本。

use_frameworks! 鏈接定制

iOS 8.0 引入了應用發布動態鏈接框架的功能。為此,CocoaPods 引入了use_frameworks! DSL,可以把所有 Pod 都編譯為動態鏈接框架??蚣軟]有任何固有的鏈接,但是 Swift 最初需要動態鏈接,以在 iOS 應用中使用??梢詫㈧o態鏈接庫包裝在 .framework bundle 中。

現在,Swift 支持靜態鏈接,CocoaPods 擴展了此 DSL,以允許指定首選的鏈接類型。

use_frameworks! :linkage => :static

這是向 CocoaPods 用戶提供更多如何將 Pod 包裝和鏈接到其相關二進制文件的控制權的第一步。有關更多詳細信息,請查看 https://github.com/CocoaPods/CocoaPods/issues/9099

下一步計劃

在將來的版本中,我們將繼續擴展有關如何將 Pod 集成到項目中的自定義功能??梢蚤喿x https://github.com/CocoaPods/CocoaPods/releases/tag/1.9.0.beta.1 以了解所有更新。

丰禾棋牌官网1369