Cocoapods上傳pod框架的原理和使用

原理介紹

  1. cocoapods是一個(gè)ios的包管理工具,基于ruby,安裝使用命令sudo gem install cocoapods.
  • cocoapods的描述文件為一個(gè)${項(xiàng)目名}.podspec的文件,通過該描述文件表征你的項(xiàng)目地址,項(xiàng)目使用的平臺(tái)和版本等信息.
  • cocoapods遠(yuǎn)端庫僅僅只是維護(hù)所有的podspec文件,而podspec文件的正確性,需要在本地通過pod lib lint 命令來校驗(yàn) 校驗(yàn)成功才可以上傳到遠(yuǎn)端master庫.
  • cocoapods對代碼的版本控制基于git倉庫的地址+tag標(biāo)簽,也就是說pod倉庫的版本號(hào)要跟git倉庫的tag號(hào)碼一致.

操作流程

沒有倉庫

如果用戶已經(jīng)有生成好的源代碼文件,在源代碼文件夾下使用命令pod lib create ${項(xiàng)目名},此命令會(huì)給你生成一個(gè)默認(rèn)的"模板"倉庫(腳手架)和podspec文件,按照此文件去生成和提交你的三方庫源代碼和上傳到pod倉庫.

已有倉庫

如果你已經(jīng)有了倉庫并且已經(jīng)寫好的自己的源代碼,那么就不能使用pod 提供的腳手架再去重新生成項(xiàng)目,這個(gè)時(shí)候你只需要添加一個(gè)描述文件${項(xiàng)目名}.podspec文件即可,最后依照此描述文件進(jìn)行代碼上傳.

  1. 在你的項(xiàng)目目錄下使用pod spec create ${項(xiàng)目名} 來創(chuàng)建一個(gè)官方的podspec描述文件.

Pod::Spec.new do |s|
s.name = “項(xiàng)目名字”
s.version ="版本號(hào)"
s.summary = "項(xiàng)目介紹"
s.homepage = "你的主頁地址"
s.license = "MIT" //這里就選這個(gè)許可證
s.author ={"你的名字" => "郵箱"}
s.platform =iOS,"最低支持的系統(tǒng)"
s.source ={git =>"項(xiàng)目git地址",tag =>"tag號(hào)"}
s.source_files = "text/*/.(h.m)" //這里是項(xiàng)目路徑要傳的文件
s.framework ="UIKit" //依賴的系統(tǒng)庫 可以依賴多個(gè)
// 若需要依賴其他開源的第三方庫 可以寫成下列形式 若需要有多個(gè)就復(fù)制下面代碼 添加第三方庫
// s.dependency "AFNetWorking"
// 如果需要配置依賴系統(tǒng)庫
// s.framework = 'SomeFramework'// 設(shè)置依賴的系統(tǒng)庫名稱
// s.frameworks = 'SomeFramework', 'AnotherFramework'//設(shè)置多個(gè)系統(tǒng)庫名稱
// 需要依賴系統(tǒng)的library
s.library = 'iconv'// 設(shè)置只依賴一個(gè)系統(tǒng)的library
s.libraries = 'iconv', 'xml2' // 設(shè)置依賴多個(gè)系統(tǒng)的library
// 這里是工程配置,這樣使用者就不需要手動(dòng)處理,由pod自動(dòng)處理了
s.xcconfig = {'HEADER_SEARCH_PATHS' =>'$(SDKROOT)/usr/include/libxml2'}

2.對此描述文件的內(nèi)容進(jìn)行校驗(yàn),按照提示修改錯(cuò)誤.使用pod lib lint ${項(xiàng)目名}.podspec --allow-warnings --verbose進(jìn)行校驗(yàn),直到最后沒有error( passed validation )為止.

關(guān)于pod lib lint ${項(xiàng)目名}.podspec --allow-warnings --verbose的實(shí)現(xiàn)細(xì)節(jié)探究:
在調(diào)用lint方法的時(shí)候,讀取的是本地的podspec文件,但是拉取的代碼,是podspec文件中的s.source描述的遠(yuǎn)端git倉庫代碼.所以podspec文件傳不傳到git倉庫本身沒有關(guān)系,因?yàn)樽x取的是本地的.

  • 描述文件:


    Paste_Image.png
  • 命令執(zhí)行具體細(xì)節(jié)
    Paste_Image.png

    疑問:描述文件中的tag設(shè)置為998,但命令執(zhí)行的細(xì)節(jié)上使用的是--branch而不是tag?
    當(dāng)給代碼的有相應(yīng)的tag的時(shí)候,就會(huì)去git拉tag對應(yīng)的代碼,如果沒有tag,就會(huì)拉對應(yīng)名稱的branch,如果同時(shí)又branch和tag的話,優(yōu)先branch.如果都沒有才會(huì)報(bào)錯(cuò).

3.至此為止你的項(xiàng)目和你的podspec文件已經(jīng)生成完畢,下面我們需要讓pod的版本號(hào) 和我們當(dāng)前代碼的tag號(hào)保持一致,這樣cocoapods才可以做好版本管理.(cocoapods就是通過git的tag號(hào)進(jìn)行自己的版本控制的.)

git add .
git commit -m "添加pod版本號(hào)${version}"
git tag 0.0.1 // tag 和上面你設(shè)定的一樣 一般tag號(hào)和版本號(hào)一致
git push --tags // 本地tag push到遠(yuǎn)端
git push origin master // 本地代碼push到遠(yuǎn)端
git對tag和branch的管理: 傳送門

4.最后一切驗(yàn)證通過之后 將podpsec文件推到pod庫中.
推送之前可以手動(dòng)更新一下本地pod倉庫pod repo update(可選)

pod trunk push "${項(xiàng)目名}".podspec --allow-warnings --verbose

5.需要一段時(shí)間,過一段時(shí)間之后,去官方庫里面搜你的項(xiàng)目名就可以了! 傳送門


常用命令解讀

1.pod spec lint

  • --verbose:打印詳細(xì)的流程
  • --allow-warnings:允許warnings存在,不添加此項(xiàng)會(huì)導(dǎo)致只要有warning就會(huì)編譯不通過
  • --skip-import-validation Lint skips validating that the pod can be imported/skip linking a pod during lint
  • --use-libraries :If it needs to be a static library, lint with --use-libraries./ pod trunk push has the --use-libraries flag.參考

常見問題

1.pods文件是否需要先上傳到倉庫之后再使用pod spec lint ..?
答案: 不需要 podspec文件可以獨(dú)立存在,不需要上傳到遠(yuǎn)端,文件中的s.version跟s. source中的git倉庫必須有同名的branch或者tag.這樣在執(zhí)行l(wèi)int的時(shí)候才能下載到對應(yīng)的源代碼進(jìn)行編譯校驗(yàn).(.podspec文件往往會(huì)跟項(xiàng)目代碼放到同級目錄下并且保存到git倉庫,但是不是必須.尤其是在調(diào)試lint的時(shí)候,不需要調(diào)試一次push一次.)

2.需要讓編譯支持MRC的類.

設(shè)置需要MRC編譯的文件

mrr_files = [
'VZInspector/toolbox/mermoryProfile/vendor/allocationTrack/NSObject+VZAllocationTracker.mm',
'VZInspector/toolbox/mermoryProfile/vendor/allocationTrack/VZAllocationTrackerNSZombieSupport.mm',
'VZInspector/toolbox/mermoryProfile/vendor/Associations/VZAssociationManager.mm',
'VZInspector/toolbox/mermoryProfile/vendor/Layout/Blocks/VZBlockStrongLayout.m',
'VZInspector/toolbox/mermoryProfile/vendor/Layout/Blocks/VZBlockStrongRelationDetector.m',
'VZInspector/toolbox/mermoryProfile/vendor/Layout/Classes/VZClassStrongLayoutHelpers.m'
]
files = Pathname.glob("VZInspector/*/")
files = files.map {|file| file.to_path}
files = files.reject {|file| mrr_files.include?(file)}
s.requires_arc = files

3.cannot create __weak reference in file using manual reference counting 解決方案.

配置文件添加:
s.xcconfig = {
'CLANG_ENABLE_OBJC_WEAK' => 'YES'
}
參考:傳送門

4.頭文件中含有C++文件,報(bào)錯(cuò)類似于error: unknown type name 'namespace'

首先 s.libraries = "c++"
其次在lint的時(shí)候加上參數(shù) --use-libraries.
參考:傳送門


官方文檔: 傳送門

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

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

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