一、背景
將Swift工程依賴的三方庫生成xcframework二進制庫格式后,制作為pod私有庫,然后工程改為依賴這個pod私有庫该贾。
然后執(zhí)行pod install,報錯:
The ‘Pods-XXX’ target has transitive dependencies that include statically linked binaries: xxxx.xcframework
.
Pods-XXX具有可傳遞的依賴項捌臊,依賴項中包含了靜態(tài)鏈接的二進制文件杨蛋。
- transitive dependencies
在Cocoapods
的依賴結構中,某個庫所依賴的庫稱為直接依賴項娃属,這些直接依賴項所依賴的其他庫稱為傳遞依賴項。
簡單來說护姆,如果 Pods-XXX 中的一個庫A依賴了另一個庫B矾端,那么B就是庫A的直接依賴項,而如果庫B又依賴了其他庫C和D卵皂,那么C和D就是 Pods-XXX 的傳遞依賴項秩铆。
在這種情況下,當您編譯Pods-XXX時,編譯器需要將所有傳遞依賴項的代碼一起編譯并打包到最終生成的可執(zhí)行文件中殴玛。
二捅膘、 報錯的原因及解決
- 報錯的原因
通常是由于動態(tài)庫和靜態(tài)庫之間的沖突導致的。你的 Podfile 中的某些其他依賴可能已經使用了靜態(tài)庫(可能是.podspec文件中寫了s.static_framework = true
)滚粟,并與你的xcframework
沖突寻仗。一般這個沖突是由于構架不匹配:xcframework
支持多個架構的二進制文件,但靜態(tài)庫通常只提供單個架構的二進制文件凡壤。如果你的靜態(tài)庫和xcframework
之間的架構不匹配署尤,就會導致沖突。
解決方法
辦法一:
將依賴了xcframework庫的私有庫改為動態(tài)庫(s.static_framework = false
)亚侠。
- 方法二:繞過CocoaPods靜態(tài)庫傳遞依賴檢查機制曹体。
修改podfile,增加如下代碼
pre_install do |installer|
Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {}
end
說明:
這段代碼使用 Ruby 的元編程方式在 Pod 庫中的 Pod::Installer::Xcode::TargetValidator 類中定義了一個名為 verify_no_static_framework_transitive_dependencies 的空方法硝烂。
具體來說箕别,這是使用了 Ruby 中的 define_method 方法,它可以動態(tài)地為某個類添加一個方法滞谢。在這里串稀,通過使用 define_method 方法,我們可以將一個名為 :verify_no_static_framework_transitive_dependencies 的方法添加到 ‘Pod::Installer::Xcode::TargetValidator’ 類中爹凹。
在這個方法中厨诸,并沒有具體的實現(xiàn)代碼,而是一個空方法禾酱。這是因為這個方法需要在運行時被 CocoaPods 內部的其他方法調用微酬,以實現(xiàn)檢查靜態(tài)庫傳遞依賴的功能。
這種做法可以繞過 CocoaPods 實際代碼中對 verify_no_static_framework_transitive_dependencies 的檢查機制颤陶,從而設置該選項為 true颗管,以驗證 CocoaPods 依賴是否存在靜態(tài)庫傳遞依賴。也就是說滓走,通過這段代碼垦江,我們可以使用靜態(tài)庫作為 CocoaPods 直接依賴,同時仍然開啟 verify_no_static_framework_transitive_dependencies 檢查機制搅方,使得 CocoaPods 仍然可以檢查傳遞依賴是否符合要求比吭。
需要注意的是,這種做法并不推薦使用姨涡,因為繞過 CocoaPods 檢查機制可能會導致其他問題的出現(xiàn)衩藤。通常來說,我們應該盡可能避免靜態(tài)庫的傳遞依賴涛漂,并且始終推薦使用動態(tài)庫來避免相關的問題赏表。