前言
2016年開始使用組件化項目,但是一直沒有整理創(chuàng)建私有庫的流程了,直到隔了很久自己在創(chuàng)建私有庫的時候又遇到了一些坑臼予,就有整理一份文檔的想法了。眾所周知啃沪,Cocoapods是一個程序依賴工具粘拾,使用Cocoapods可以節(jié)省設(shè)置和更新第三方開源庫的時間,當然也可以利用Cocoapods來管理我們的私有庫谅阿。
組件化的第一步就是創(chuàng)建自己的倉庫半哟,若是公司的項目可以用gitlab。
1签餐、創(chuàng)建遠程索引庫
我使用的是coding寓涨,大家也可以使用github、碼云等等
創(chuàng)建一個私有倉庫名稱為TestSpec氯檐。
2戒良、創(chuàng)建本地索引庫
1、創(chuàng)建本地私有索引庫Spec Repo
如果之前已經(jīng)有私有spec repo冠摄,無需再創(chuàng)建糯崎,若沒有需要創(chuàng)建一個私有的spec repo
使用命令:pod repo add <本地索引庫名稱> <遠程索引庫地址> 如:pod repo add TestSpec https://e.coding.net/wojia/testdemo/TestSpec.git
創(chuàng)建之后几缭,可以查看下本地是否已創(chuàng)建成功:pod repo list
正常情況下會有一個公有的CocoaPods官方的master repo 和你的 私有庫spec repo,可以通過~/.cocoapods/repos目錄看到它們在本地的存放路徑沃呢。
3年栓、創(chuàng)建遠程代碼倉庫
遠程代碼倉庫是用來管理某一個組件的代碼倉庫,它和索引庫不是同一個倉庫薄霜。這個遠程代碼倉庫可以是svn某抓、碼云、git惰瓜。和創(chuàng)建索引庫流程一樣創(chuàng)建一個代碼倉庫否副。我這邊創(chuàng)建的是一個TestLib代碼倉庫。
4崎坊、創(chuàng)建本地代碼庫
這個就是某個組件的本地代碼庫,在想要創(chuàng)建的目錄文件夾下創(chuàng)建pod私有庫备禀。
1、在該目錄下使用命令:pod lib create TestLib
之后會出現(xiàn)幾個問題奈揍,按照提示
選擇使用平臺
選語言 swift/OC
選擇是否生成一個demo
選擇測試框架 Specta/Kiwi/None
選擇是否做基于View的測試
確定一個文件前綴
2曲尸、成功之后會自動打開一個剛剛創(chuàng)建的工程,編譯一下打月,成功队腐。
我們用finder打開工程目錄,進入 TestLib -> Classes ->
把自己的組件代碼拷貝一份過來奏篙,并刪除 ReplaceMe.m柴淘。然后進入Example文件夾執(zhí)行pod update命令,再打開項目工程可以看到秘通,剛剛添加的TestLib文件已經(jīng)在Pods子工程下的Development Pods/TestLib中了为严。
3、cd 到 Example目錄下肺稀, pod install 一下第股,把剛才拖入到 classes 里的文件pod進來。因為podfile里面默認會導(dǎo)入classes里的文件话原。查看無誤后需要將該項目添加并推送到遠端倉庫夕吻,并編輯修改 TestLib.podspec 文件里面配置項s.homepage、s.source繁仁、s.source_files
Cocoapods創(chuàng)建出來的目錄本身就在本地的Git管理下涉馅,我們需要做的就是給它添加遠端倉庫,同樣去GitHub或其他的Git服務(wù)提供商那里創(chuàng)建一個私有的倉庫(事先已創(chuàng)建)
4黄虱、檢查無誤后就可以提交代碼稚矿,并打tag。首先進入剛才創(chuàng)建的倉庫,即要上傳代碼的目錄
cd TestLib
執(zhí)行g(shù)it命令晤揣,此命令會在當前目錄下創(chuàng)建一個.git文件夾
git init
將項目的所有文件添加到倉庫中
git add .
將add的文件commit到倉庫
git commit -m 'init com'
將本地的倉庫關(guān)聯(lián)到gitlab上
git remote add origin <遠程代碼塊地址>
上傳代碼到遠程倉庫
git push origin master 或者 git push -u origin master(第一次提交用)
git tag <版本號> | git tag ?a 版本號?m '??????????????版本號'這里的版本號必須和podsepc文件里的一致桥爽。
git tag 驗證版本號是否提交成功
$git push --tags
5、編輯podspec文件
上傳完工程后就可以開始編輯podspec文件了昧识,這里是TestLib.podspec文件钠四,它是一個Ruby文件,用SubLime打開它滞诺,把編輯格式改成Ruby就能看到語法高亮了形导,原始的podspec文件已經(jīng)有很多內(nèi)容了,其中以#開頭的都是被注釋掉的部分习霹,看起來應(yīng)該像下圖所示:
下面是編輯完成后的podspec文件,每個配置項后面都添加上了注釋:
編輯完podspec文件后炫隶,需要驗證一下這個文件是否可用淋叶,如果有任何warning或者error都是不可以的,它就不能被添加到Spec Repo中伪阶。驗證需要執(zhí)行以下命令:
有兩種驗證方式:
本地驗證:pod lib lint your_podName.podspec 是檢索本地文件
聯(lián)網(wǎng)驗證:pod spec lint your_podName.podspec 是本地和遠程庫提示檢索
當你看到
表示驗證通過了煞檩,不過這只是說明這個podspec文件是合格的,驗證的時候也出現(xiàn)過錯誤栅贴,如下:
是因為遠程倉庫雖然創(chuàng)建了斟湃,但是沒有初始化,初始化之后重新驗證就可以驗證通過檐薯。
驗證通過了凝赛,不過最好還是在本地項目調(diào)用再驗證下,驗證podspec文件的正確性后坛缕,可以在本地先進行一次安裝墓猎,沒問題后再推送到倉庫,修改podfile赚楚,指定podspec地址為本地的地址:
pod 'TestLib', :podspec => '/Users/admin/Desktop/TestProject/TestLib/TestLib.podspec'
然后執(zhí)行pod install命令安裝依賴,打開項目工程宠页,可以看到庫文件都被加載到Pods子項目中了左胞,不過它們并沒有在Pods目錄下,而是跟測試項目一樣存在于Development Pods/Test中举户,這是因為我們是在本地測試烤宙,并沒有把podspec文件添加到spec repo。
6敛摘、向Spec Repo提交podspec
pod repo push TestSpec TestLib.podspec --allow-warnings
前面是本地Repo名字(就是本地代碼倉庫文件夾名稱) 后面是podspec名字 (spec的名稱)
同樣的加上上面驗證時使用到的可選參數(shù)
7门烂、私有組件庫制作完成后,可以使用pod search命令驗證一下
pod search TestLib
8、在其他項目如何使用:新建一個工程
在Podfile 文件里做引用屯远,然后pod install即可,不要忘記把 自己的索引庫 添加到source 配置項里
9蔓姚、swift私有庫和oc私有庫創(chuàng)建方式一樣,區(qū)別在于外面工程要用的私有庫里面的類或者屬性需要使用public或者open修飾慨丐,否則外界就會找不到這個類或者屬性cannot find type 'xxxx' in scope
10坡脐、需要注意私有庫里面圖片的使用需要通過bundle獲取,如下使用方式 func getImageByName(imageName: String) -> UIImage? {
var scaleStr = ""
if UIScreen.main.scale == 1 {
scaleStr = ""
} else if UIScreen.main.scale == 2 {
scaleStr = "@2x"
} else if UIScreen.main.scale == 3 {
scaleStr = "@3x"
}
let newImageName = imageName + scaleStr
let imgPath = myBundle()?.path(forResource: newImageName, ofType: "png")
if let path = imgPath {
return UIImage.init(contentsOfFile: path)
}
return nil
}
//獲取bundle
func myBundle() -> Bundle? {
let bundle = Bundle.init(for: FNScrollHeaderView.self)
let bundleUrl = bundle.url(forResource: "FNScrollComponentSwift", withExtension: "bundle")
if let url = bundleUrl {
return Bundle.init(url: url)
}
return nil
}
私有庫地址:https://e.coding.net/wojia/testdemo/FNScrollComponentSwift.git