最近有新的項目要開發(fā),除了基礎(chǔ)庫,整個業(yè)務(wù)代碼全部重寫,小伙伴們每天pod install和編譯運行的次數(shù)非常多,而項目中的庫都以源碼的形式集成,勢必造成編譯時間大大加長.開發(fā)效率受很大影響.
因此把組件二進(jìn)制化制作成靜態(tài)庫就呼之欲出了.我一直喜歡研究組件化的東西,但是做起來還是遇到各種問題,有些問題解決了才發(fā)現(xiàn)對cocoapods的流程有更加深刻的理解.那么我就說說制作組件的靜態(tài)庫的流程.
我現(xiàn)在的目標(biāo)是把github的Masonry放到我自己創(chuàng)建的私有庫,并且制作成靜態(tài)庫
1,把Masonry從github拷貝到本地
git clone https://github.com/SnapKit/Masonry

2,在私有云端創(chuàng)建一個空項目


3,使用pod package Masonry.podspec命令制作靜態(tài)庫
- 切換到Masonry目錄下 執(zhí)行
pod package Masonry.podspec --force --embedded --no-mangle --exclude-deps(前提要gem install cocoapods-packager) - 簡單起見,我們先只做iOS平臺下的靜態(tài)庫所以要注釋掉Masonry.podspec文件中一些描述信息,注釋掉所有其他平臺的信息這樣就只制作iOS平臺下的靜態(tài)庫了.



- 可能出現(xiàn)的報錯: 這里面要注意pod package命令會根據(jù)spec文件中source指定的地址下載代碼打包

- 所以先不要著急修改這個地址為第二步你創(chuàng)建的私有項目地址,否則就會報下面的錯誤.
[!] Error installing Masonry
[!] /usr/bin/git clone https://git.coding.net/codingheew/Masonry.git /var/folders/cb/np76rpl52kqb5r16tp4njgrm0000gn/T/d20171016-26288-z1v7u8 --template= --single-branch --depth 1 --branch 0.7.1
Cloning into '/var/folders/cb/np76rpl52kqb5r16tp4njgrm0000gn/T/d20171016-26288-z1v7u8'...
fatal: unable to access 'https://git.coding.net/codingheew/Masonry.git/': Could not resolve host: git.coding.net

- 仔細(xì)理解下這個報錯也能看出來,pod package首先做的就是去source指定的地址和tag名下載代碼,而先改動了spec文件中source地址的話,又沒有提交代碼到創(chuàng)建的空項目,那么肯定是找不到任何代碼的.
- 當(dāng)然不改動source地址,去github下載代碼那也是挺費力的一件事情.為了讓pod package這步是從國內(nèi)的代碼服務(wù)器下載代碼打包當(dāng)然是可以的,為了不打斷讀者的思路,我在寫完這個流程后再回過頭說下,如何在這一步減少pod package的執(zhí)行時間.
4,修改spec文件

- homepage social_media_url source三個地方的URL都改為第二步創(chuàng)建的項目的地址(homepage social_media_url也可以為其他能訪問的地址)
- vendored_framework的路徑指向第三步制作好的靜態(tài)庫地址
- 繼續(xù)在Masonry目錄下使用
pod lib lint命令驗證,這個時候是用spec去驗證本地Masonry-1.1.0/ios/下Masonry.framework的正確性,通過則表面spec和framework都沒有問題
image.png
5,上傳代碼到云端私有項目
到目前為止總結(jié)幾點:1,第二步創(chuàng)建的云端私有項目還是什么都沒有.2,而且云端私有項目和本地Masonry項目沒有建立關(guān)系.3,本地Masonry已經(jīng)具有靜態(tài)庫和一個描述正確的spec文件.4,接下來需要把本地完好的項目上傳到私有云端.
- 使用
git remote set-url建立本地項目和遠(yuǎn)程項目的聯(lián)系

- 重新打v1.1.0的標(biāo)簽,把靜態(tài)庫包含到v1.1.0標(biāo)簽

-
git pushgit push --tags把代碼和tag都push到私有云端項目

- 遠(yuǎn)程私有倉庫刷新看下,代碼和tag都應(yīng)該有了


6,pod spec lint進(jìn)行遠(yuǎn)程驗證

這是最后也是最關(guān)鍵的一步,這步的流程也就是cocoapods管理代碼的核心流程,具體如下
- 根據(jù)
本地的spec描述文件
特別說明pod spec lint這步其實還是本地spec的描述去驗證,所以第4步spec如果vendored_framework寫錯了,第4步其實是可以通過的,只不過你遠(yuǎn)程項目中的spec描述是不對的,其他人維護(hù)你的項目到了pod spec lint這一步就懵逼了.所以第4步還是要寫對了,寫錯了,就重新修改再按照第5步刪掉tag提交代碼重新打一次標(biāo)簽) - 去source指定的地址和指定tag,拷貝項目
這里是cocoapods找代碼的第一步,對應(yīng)就是s.source = { :git => 'https://git.coding.net/codingheew/Masonry.git', :tag => "v#{s.version}" }這句描述 - 再根據(jù)vendored_framework的路徑去找靜態(tài)庫文件
這里cocopods找代碼的第二步,spec文件中寫了vendored_framework就意味著是要以靜態(tài)庫的形式集成代碼,所以就最好不要在spec同時有source的描述,即便有也只讓source指定.h文件.
事實上通過source和vendored_framework并存可以兼容已經(jīng)寫好的項目中存在大量#import "Masonry.h"的引入方式.這里多費點口舌,解釋下,因為source指定了.h文件,cocoapods會把你指定的.h文件都暴露到framework以外,因此別人在導(dǎo)入的時候既可以通過#import "Masonry.h",也可以通過#import <Masonry/Masonry.h>的方式找到你的頭文件
7,最后pod repo push把本地的spec文件提交到索引repo
- 建一個私有索引spec庫(如果已經(jīng)有,直接提交到已有索引庫即可)

- 這一步不要想的太復(fù)雜,索引庫就是放Masonry.podspec文件,真的其他什么都沒有
- 再通過
pod repo add添加到本地pod repo中,這一步也不要想復(fù)雜,就是把一個空項目clone到本地repo路徑下,僅此而已
圖片 5.png

- 最后一步,切換到Masonry目錄下,把spec傳到索引庫,pod會自動push到遠(yuǎn)程的索引庫

- 這步成功,所有的工作就都做完了.看下現(xiàn)在本地索引庫和遠(yuǎn)程索引庫的變化


8, 如何使用靜態(tài)庫
- 新建一個test項目在podfile中像下面這樣寫


最后說下第三步中減少pod package的執(zhí)行時間.只說下思路,不進(jìn)行截圖了,免得對于一些初學(xué)者更亂了.
1,修改spec中source地址為項目地址
2,根據(jù)第5步提交代碼以及tag到遠(yuǎn)程私有倉庫
3,執(zhí)行pod package Masonry命令
4,在第5步重新打標(biāo)簽需要多一步刪除遠(yuǎn)程v1.1.0標(biāo)簽的步驟具體命令為
git push origin :'v1.1.0'
5,然后再重新commit 重新打標(biāo)簽 提交標(biāo)簽
文章中用到的代碼都已開源
私有索引庫地址 https://git.coding.net/codingheew/codingSpec.git
私有Masonry庫地址 https://coding.net/u/codingheew/p/Masonry/git

