Cocopods 本身是一個優秀的 iOS 開發的包管理工具,涵蓋了 7k+ 的開源元件,包管理庫是托管在 Github。
由于衆所周知的原因它的速度日漸緩慢,有時會頻繁報如下錯誤:
1 2 3 4 | |
本文主要為解決該問題而誕生的,以下的加速方案不局限于目前已流傳的優化方案,而是在此基礎上徹底的加速!
- 使用淘寶 Ruby Gems 源(Cocoapods 使用 ruby 開發)
- pod install 時不設定包的更新:參考文章
- 使用國内 git 伺服器鏡像 Cocoapods Spec: 參考文章
如果你對 Cocoapods 有更深層次的了解,請參見:objc.io: Cocoapods under the hood 中文版本
今天早晨看到微網誌衆多 iOS 開發者贊同轉發《CocoaPods最佳實踐探讨》一文,
針對 Pods 建議納入版本控制也是無奈之舉。之前公司項目中也是這樣施行很長一段時間,不排除更新可能會造成很多無用資訊”刷屏”,偶爾還會因為版本沖突造成一些混亂狀況需要處理。個人還是更傾向于精簡原則,遵循官方的建議。
大家都是技術人員,其實這些小問題難道因為 github 倒下就沒有解決方案了嗎?!看我如何撕破這層紙老虎:
技術概述
- Cocopods v0.34.0+
- gitlab: 自建私有 git 伺服器
- gitlab-mirrors: 專用于 github 鏡像至 gitlab 并保持定期更新
- rake: ruby 的代碼建構工具(不懂 ruby 的可以把它了解為指令聚合工具)
技術剖析
Cocoapods 自身支援私有倉庫,
恰好的是就在前不久釋出的 0.34.0 版本支援 Podfile
添加多個的包源倉庫,舉個例子:
1 2 3 4 | |
這個特性其實是為了擴充官方 Spec 的同時可以更好的讓開發者管理私有的公共元件,那我同樣是從這裡下手:
前提是自己以及搭建好 gitlab 伺服器:官方教程 (Ubuntu) | 本人教程 (CentOS)
自力更生
首先我們需要建立一個自己的 Spec 倉庫,目錄結構如下:
1 2 3 4 5 6 | |
配置不做較長的描述,這裡比官方多了兩個檔案 Rakefile 和 Gemfile 都是 rake 所需的檔案,這個後面會講到。
再者就是配置 gitlab-mirrors,教程很詳細不再重複。
偷梁換柱
利用私有 Spec 倉庫特性,可以把官方 Spec 目錄下面的包按需或全部鏡像過來,再次基礎上把裡面涉及 github 的位址替換成 gitlab 的位址
你沒有看錯,這是核心步驟,如果這步沒有做那麼和國内鏡像的位址沒有任何差别。核心代碼如下:
Rakefile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | |
Gemfile
1 2 3 4 5 | |
rake 裡面有兩個 task:
- mirror: 鏡像 iOS 開源元件
- clone: 負責把官方 spec 指定包(開源元件的版本控制)替換 gitlab 位址并加入到私有包倉庫
總結
通過工具總有辦法可以改進和提升開發者的效率和解決各種的問題,希望本文可以給大家帶來更多的靈感!
答疑解惑
F: 這套理論靠譜嗎?
A: 目前我們團隊已經采用并運作了很長一段時間,沒有任何風險。最大的優勢在于相容官方的倉庫,
就算無法連結自己的私有伺服器,使用官方和國内鏡像的都可以瞬間切換。
F: 如果沒有伺服器可以實作嗎?
A: 醒醒吧孩子,就連單純的鏡像官方 Cocoapods Spec 還需要一個伺服器執行定期同步腳本呢。
F: 國内 git 托管伺服器能夠支援嗎?
A: 據我所知國内大部分 git 托管伺服器的解決方案都是基于 gitlab 二次開發的,理論上可行,
上面提到的 gitlab-mirror 本身依賴于 gitlab 的 api 在鏡像的同時自動建立倉庫。如果有成功的歡迎回報。
F: 我從你代碼發現伺服器同樣調用了一個 rake 腳本,你沒有開源!
A: 眼睛真夠敏銳的,個人對 gitlab-mirror 再做鏡像時做了一個限制,建立一個 Rakefile 檔案放到你的 gitlab-mirror 項目根目錄即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
轉載于:https://www.cnblogs.com/wntd/p/5895318.html