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

原理介紹

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

操作流程

沒有倉庫

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

已有倉庫

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

  1. 在你的項目目錄下使用pod spec create ${項目名} 來創建一個官方的podspec描述文件.

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

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

關于pod lib lint ${項目名}.podspec --allow-warnings --verbose的實現細節探究:
在調用lint方法的時候,讀取的是本地的podspec文件,但是拉取的代碼,是podspec文件中的s.source描述的遠端git倉庫代碼.所以podspec文件傳不傳到git倉庫本身沒有關系,因為讀取的是本地的.

  • 描述文件:


    Paste_Image.png
  • 命令執行具體細節
    Paste_Image.png

    疑問:描述文件中的tag設置為998,但命令執行的細節上使用的是--branch而不是tag?
    當給代碼的有相應的tag的時候,就會去git拉tag對應的代碼,如果沒有tag,就會拉對應名稱的branch,如果同時又branch和tag的話,優先branch.如果都沒有才會報錯.

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

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

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

pod trunk push "${項目名}".podspec --allow-warnings --verbose

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


常用命令解讀

1.pod spec lint

  • --verbose:打印詳細的流程
  • --allow-warnings:允許warnings存在,不添加此項會導致只要有warning就會編譯不通過
  • --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文件可以獨立存在,不需要上傳到遠端,文件中的s.version跟s. source中的git倉庫必須有同名的branch或者tag.這樣在執行lint的時候才能下載到對應的源代碼進行編譯校驗.(.podspec文件往往會跟項目代碼放到同級目錄下并且保存到git倉庫,但是不是必須.尤其是在調試lint的時候,不需要調試一次push一次.)

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

設置需要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++文件,報錯類似于error: unknown type name 'namespace'

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


官方文檔: 傳送門

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容