升級 CocoaPods 1.5,使用 Swift Static Library
來自專欄 Prelude
升級 CocoaPods 1.5,使用 Swift Static Library
CocoaPods 1.5 is amazing!
CocoaPods 1.5 在前一段時間 release 了,其中有一個對於使用了 Swift 的項目非常重要 feature,那就是支持了 Swift 的 Static Library。
這還要講講 Swift Static Library 的歷史。在 Xcode 9 之前,並不支持 Swift Static Library;Xcode 9 之後支持了 Swift 的 Static Library,但是使用 Swift + CocoaPods 的項目並沒有辦法使用 Static Library,因為 CocoaPods 不支持。在 CocoaPods release 1.4 版本 的時候,終於支持了在 use_framework!
的情況下使用 Static Library,但是對於 Swift 和 Objective-C 混編的項目還是未能完美支持;終於在 1.5 版本,Swift 的項目能用上 Static Library 了!
為什麼這件事情令人興奮呢?這還得從 Dynamic Library 說起。Apple 官方推薦每個 App 使用 Dynamic Library 的數量是 6 個,這是有原因的。因為在 App 啟動的時候,dyld 會load 這些動態庫,這會造成啟動時間的增加;而且動態庫數量過多,還會在 iOS 9 的設備上造成 dyld 的 crash。所以使用 Static Library 應該是每個使用了 Swift + CocoaPods 的項目都期望的事情。
在 CocoaPods 還未支持這件事情的時候,可以使用 cocoapods-amimono 這個插件。它會把所有 Dynamic Library 的符號拷貝到最終程序的可執行文件中,解決上面出現的兩個問題。
既然使用動態庫有這樣那樣的問題,那在升級了 1.5 以後,全都使用靜態庫不就好了?事是這麼回事,但使用靜態庫也不是完美的,因為你還可能會遇到這樣的問題:兩個 Framework 中如果定義了相同名字的 C 函數會發生什麼? ,調用 category 方法會 crash 等等,不過都比較好解決,不像 Dynamic Library 那樣有硬傷。
總體上來說,使用靜態庫還是比動態庫有優勢的。
然而要想在項目中使用這個 feature,需要在 podspec
顯示指定 s.static_framework = true
,對於集成 100 多個 pod 的項目來說,一個個改起來太麻煩了,也不現實。但是 CocoaPods 是 Ruby 寫的呀,我們可以通過 patch CocoaPods 來實現在只寫幾行代碼的情況下,把所有 pod 變成 Static Framework,
在 Podfile 的同級目錄創建 patch_static_framework.rb
,
module Pod class PodTarget def static_framework? return true end endend
在 Podfile 的最上面,引入該文件,
require_relative patch_static_framework
這樣對於 PodTarget 的 patch 就會在 pod install
的時候生效,所以我們就不需要改每個 pod 的 podspec 就可以實現每個 pod 都是 static_framework
的效果了
推薦閱讀: