如何使用cocoapods制作第三方的鏡像和靜態(tài)庫

最近有新的項目要開發(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

image.png

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

image.png
image.png

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)庫了.
image.png
image.png
image.png
  • 可能出現(xiàn)的報錯: 這里面要注意pod package命令會根據(jù)spec文件中source指定的地址下載代碼打包
image.png
  • 所以先不要著急修改這個地址為第二步你創(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
image.png
  • 仔細(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文件

image.png
  • 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)系
image.png
  • 重新打v1.1.0的標(biāo)簽,把靜態(tài)庫包含到v1.1.0標(biāo)簽
圖片 1.png
  • git push git push --tags把代碼和tag都push到私有云端項目
圖片 2.png
  • 遠(yuǎn)程私有倉庫刷新看下,代碼和tag都應(yīng)該有了
圖片 3.png
圖片 4.png

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

image.png

這是最后也是最關(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)有,直接提交到已有索引庫即可)
image.png
  • 這一步不要想的太復(fù)雜,索引庫就是放Masonry.podspec文件,真的其他什么都沒有
  • 再通過pod repo add添加到本地pod repo中,這一步也不要想復(fù)雜,就是把一個空項目clone到本地repo路徑下,僅此而已
    圖片 5.png
image.png
  • 最后一步,切換到Masonry目錄下,把spec傳到索引庫,pod會自動push到遠(yuǎn)程的索引庫
image.png
  • 這步成功,所有的工作就都做完了.看下現(xiàn)在本地索引庫和遠(yuǎn)程索引庫的變化
image.png
image.png

8, 如何使用靜態(tài)庫

  • 新建一個test項目在podfile中像下面這樣寫
image.png
image.png

最后說下第三步中減少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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容