為什麼iOS專案應該用CocoaPods
為什麼iOS專案中應該使用CocoaPods作為第三方依賴管理工具?
目錄:
- 從一個bug說起
- 分析需求及解決方案
- 確定方案
- CocoaPods學習資料
</br>
一、從一個bug說起:
1、公司的專案裡統一使用SVG格式的圖片;
2、GitHub上只有一個star數超過一千的SVG解析庫,叫SVGKit。(對,就是這個坑爹的庫)
坑1: 這個庫一直使用非ARC,有100多個類;</a>
坑2: 這個庫還依賴另外一個庫CocoaLumberjack;
坑3: 把這個庫配置到專案中就會報一種錯誤:
3、公司的專案是直接以原始碼的形式使用的該庫。
結果就是 Build Phase 中成了這樣:
(我不知道當初加這些 -fno-objc-arc 標記的人是否崩潰,我光看著就覺得淡淡的憂桑:這麼多得加多久?加漏了或者多加了,都是坑。)
4、因為用的原始碼,專案裡的SVGKit版本很久都不會更新。導致在iPhone6S以上裝置時,由於舊版本的庫沒有適配6S,必崩。現在必須要更新到這個庫的最新版本。
二、解決方案的探索:
</br>
方案一:
用最新原始碼替換掉舊版原始碼檔案
問題:1、類檔案太多,麻煩,容易出錯;
2、還是會有大量的 -fno-objc-arc 標記,很煩;
結論:否決
</br>
方案二:
SVGKit作者推薦——靜態庫(該庫的GitHub頁面也只介紹了這一種用法)
問題:1、只有.h 標頭檔案,出錯沒法定位和修改。
2、靜態庫裡使用了category必須要加 -ObjC 標記。
3、靜態庫.a檔案需要區分device版本和simulator版本,或者合併後使用。
結論:否決
</br>
關於問題2這裡要解釋下,本來是沒什麼問題的,但我不幸遇到了這個坑:
1、靜態庫裡如果使用了 category,需要加 -ObjC 標記。否則在使用的時會崩潰:
2、當時花了好久沒解決這個問題的原因是,我記得自己設定了呀。
後來才想起來為毛還是崩,這是我們的專案target,你們感受下:
有任何一個target忘了設定,就又埋了個坑。
3、關於 為什麼要加 -ObjC 標記 的問題,以前是有查過資料的,這裡完全是因為target太多遺漏導致的。
筆記如下:
-ObjC 標記的作用:
> - 用到一個第三方庫,這個庫的使用嚮導裡面特別說明,在新增完該庫後,需要在Xcode的Build Settings下Other Linker Flags裡面加入-ObjC標誌。之所以使用該標誌,和Objective-C的一個重要特性:類別(category)有關。根據這裡的解釋,Unix的標準靜態庫實現和Objective-C的動態特性之間有一些衝突:Objective-C沒有為每個函式(或者方法)定義連結符號,它只為每個類建立連結符號。
- 這樣當在一個靜態庫中使用類別來擴充套件已有類的時候,連結器不知道如何把類原有的方法和類別中的方法整合起來,就會導致你呼叫類別中的方法時,出現"selector not recognized",也就是找不到方法定義的錯誤。
- 為了解決這個問題,引入了-ObjC標誌,它的作用就是將靜態庫中所有的和物件相關的檔案都載入進來。
- 本來這樣就可以解決問題了,不過在64位的Mac系統或者iOS系統下,連結器有一個bug,會導致只包含有類別的靜態庫無法使用-ObjC標誌來載入檔案。變通方法是使用-all_load 或者-force_load標誌,它們的作用都是載入靜態庫中所有檔案,不過all_load作用於所有的庫,而-force_load後面必須要指定具體的檔案。
</br>
方案三:
使用 CocoaPods **
問題:作者沒有說明這個庫是否支援CocoaPods**
這也是我最開始沒有考慮改用 CocoaPods 的原因)
-
這裡提示大家,可以使用以下命令,測試某個庫是否支援CocoaPods
$ pod try XXX
鑑於這裡不是介紹如何使用 CocoaPods,這裡只討論下使用 CocoaPods 的好處,以及一些使用經驗(我會在後文列一些 CocoaPods 的資料)。
優點:
1、解決了方案一中,需要在專案裡 大量標記 -fno-objc-arc 的問題:
—— CocoaPods自動生成的關聯庫會在關聯工程中自動標記好,原始專案中只管用就行
2、解決了方案二中,只有.h 標頭檔案,沒有原始碼、出錯沒法定位和修改的問題:
—— CocoaPods也是使用靜態庫依賴,但是保留全部.m檔案
3、解決了方案二中,靜態庫使用時的一些坑,和需要打包.a檔案的麻煩操作。
—— CocoaPods自動完成
4、極大的簡化了操作:
1> cd進入.xcodeproj檔案所在的目錄
$ pod init
2> 在自動生成的Podfile檔案中,加入要pod的庫名
$ pod install
3> 搞定。
5、最重要的一點:以後再遇到這次的升級第三方庫版本的需求時,只需一行命令即可:
$ pod update
結論:就是這個了!
確定方案
CocoaPods 一勞永逸的解決了第三方庫版本升級的問題。
就醬~
</br></br></br></br>
乾貨部分
CocoaPods學習資料
CocoaPods入門:
1、CocoaPods安裝和使用教程
(入門看這一篇就夠了)
2、CocoaPods pod install/pod update更新慢的問題
最近使用CocoaPods來新增第三方類庫,無論是執行pod install還是pod update都卡在了Analyzing dependencies不動
原因在於當執行以上兩個命令的時候會升級CocoaPods的spec倉庫,加一個引數可以省略這一步,然後速度就會提升不少。命令如下:
pod install --verbose --no-repo-update
pod update --verbose --no-repo-update
3、mac升級到10.11,cocoapods沒了
使用命令列sudo gem install cocoa pods出錯,換成sudo gem install -n /usr/local/bin cocoa pods即可,詳見: http://t.cn/Ry8tZAs
4、使用經驗:
1> pods install 時,可以不加版本號(預設下載對應庫的最新版本)
但是,下載完依賴後,最好加上版本號,避免在新增了新的庫,或者pod update時,由於某些第三方庫頻繁升級而帶來的不穩定。
2> 多人合作的較大專案,Podfile檔案可以設定許可權,只由一個人來修改、新增依賴的庫。
3 > SVN或者Git做版本管理時,不要上傳 Pods 、workspace 目錄:
(可以設定ignore)
</br>
CocoaPods高階用法:
1、即使你不使用第三方庫,CocoaPods仍然是一個管理程式碼相關性的絕佳工具
2、藉助GitHub託管Category,利用CocoaPods整合到專案中
3、Cocoapods建立私有podspec
4、寫一個Pod釋出到CocoaPods
5、CocoaPods的一些略為高階一丁點的使用
</br>
//TODO:1、利用多個 project 做本地依賴管理
2、私有倉庫的使用嘗試
</br></br>
相關文章
- 為什麼應該要做好專案結構的規劃
- 為什麼你應該參與到開源專案中
- 為什麼程式設計師應該架空專案經理程式設計師
- 「譯」Python 專案應該都有什麼?Python
- iOS提示框,為什麼你應該使用 MBProgressHUD?iOS
- 專案經理之專案經理應該做什麼
- 專案註定延期時,應該做什麼?
- iOS應用加固為什麼也那麼重要?iOS
- 為什麼你不應該辭職去做遊戲應用遊戲
- 什麼場景應該用MongoDB ?MongoDB
- 為什麼開發者應該摒棄敏捷?敏捷
- 為什麼你應該學 Python ?Python
- Flutter 與 Swift - 在建立 iOS 應用程式時應該押注什麼技術?FlutterSwiftiOS
- 一個優質的專案應該具有什麼特點
- 為什麼程式設計師應該寫部落格?用什麼部落格系統?程式設計師
- 為什麼專案會延期?
- 為什麼你應該嘗試 “全棧”全棧
- 為什麼你應該嘗試“全棧”全棧
- 為什麼你應該為開源做設計
- 新專案為什麼決定用 JDK 17了JDK
- 為什麼你應該學習程式設計程式設計
- 程式設計師為什麼不應該加班程式設計師
- 為什麼學校應該使用自由軟體
- 為什麼你應該使用一個PHP框架PHP框架
- 轉享:為什麼你應該使用Play框架?框架
- 為什麼微服務應該是事件驅動?微服務事件
- 為什麼你應該在專案中使用pyenv+Pipenv:為專案設定超棒的本地開發工作流之祕籍
- Python 集合是什麼,為什麼應該使用以及如何使用?Python
- 往linux核心掛鉤子–什麼應該什麼不應該Linux
- 為什麼看不見AHAS應用?
- 為什麼你應該先成為全棧工程師全棧工程師
- 新手入門應該用什麼剪輯工具?
- 為什麼Python停止執行?該如何應對?Python
- [譯] 為什麼你應該開始使用 KotlinKotlin
- 前端程式設計師為什麼應該拿高薪前端程式設計師高薪
- 前端開發人員為什麼應該拿高薪前端高薪
- 為什麼你應該永遠不要再使用MongoDBMongoDB
- 為什麼應用安全應該成為金融服務提供商的重點關注問題?