Cocopods應用及插件

聲明:html

1、安裝和使用Cocopods

網上已有不少教程,參考示例:CocoaPods安裝教程linux

2、讓本身的組件庫支持pod方式引入

1.建立遠程代碼倉庫

建立遠程代碼倉庫(並非podspec文件的倉庫),此倉庫放的是源代碼。能夠在GitHub上建立倉庫。ios

2.建立遠程specs倉庫

若是要發佈到Cocopods的官方specs倉庫(公開的官方specs倉庫),那麼就不須要建立。固然私有庫是須要建立的(建立方式和遠程代碼倉庫同樣,只不過specs放的是podspec文件),在這一步二者不同。
公開庫參考示例:發佈開源庫到Cocopods官方倉庫git

3.建立本地代碼工程

可使用pod命令建立,獲得一個工程模板,而且能夠根據須要配置工程,以下:github

  1. 命令建立工程模板
pod lib create <組件庫名>
  1. 工程配置選擇
  • 選擇平臺
What platform do you want to use?? [ iOS / macOS ]
iOS
  • 選擇語言
What language do you want to use?? [ Swift / ObjC ]
ObjC
  • 是否自動生成一個用來作demo測試的模板庫,建議Yes,後面方便測試
Would you like to include a demo application with your library? [ Yes / No ]

Yesjson

  • 是否集成測試框架
Which testing frameworks will you use? [ Specta / Kiwi / None ]
None
  • UI 測試
Would you like to do view based testing? [ Yes / No ]
No
  • 指定類前綴
What is your class prefix?
WT

工程建立以後,就能夠添加代碼文件到組件庫的class目錄,圖片資源到asset目錄,不過要注意資源的引用方式是否是一個bundle(參考連接:資源文件segmentfault

4.編寫podspec文件

若是用第三步的命令建立工程模板,那麼在Podspec Metadata目錄下已經自動生成了。若是是已有的工程或者庫文件目錄,也能夠利用Pod命令本身製做.podspec文件,命令以下:windows

pod spec cretae <組件庫名>
參考連接: podspec文件的具體說明

注意:自動生成的podspec文件只是模板,須要結合工程的庫文件、資源目錄、遠程代碼倉庫(第一步建立的遠程代碼倉庫)修改補充podspec文件。緩存

5.驗證podspec文件

命令以下:ruby

pod lib lint (從本地驗證你的pod可否經過驗證)
pod spec lint (從本地和遠程驗證你的pod可否經過驗證,⚠️ 須要更新提交podspec到遠程specs倉庫,參考第8步,通常本地驗證經過便可提交到遠程specs倉庫)
pod lib lint --verbose (加--verbose能夠顯示詳細的檢測過程,出錯時會顯示詳細的錯誤信息)
pod lib lint --allow-warnings (容許警告,用來解決因爲代碼中存在警告致使不能經過校驗的問題)
pod lib lint --sources= https://git.xxx.com/windtersh... (私有庫依賴須要添加specs源)
pod lib lint --help (查看全部可選參數,可選參數能夠加多個)

6.本地測試庫是否可用

  • 新建工程,切換到工程目錄,執行命令

    pod init
  • 修改podfile文件, 並添加上本地庫路徑

    pod '庫名', :path => '/Users/xxx/Documents/庫名'
  • 拉取pod代碼:成功後可看到咱們的庫並無在pods裏面,而是在Development Pods裏面,可用先檢測代碼有沒有問題。

7.提交工程代碼

提交工程代碼到遠程代碼倉庫,能夠利用git或者svn進行代碼版本管理,提交代碼到GitHub等, 初始化提交命令以下:

  • 初始化git版本管理倉庫,模板代碼已經初始化了(有.git文件夾),此步驟能夠忽略

    git init
  • 添加到暫存區

    git add .
  • 提交到本地倉庫

    git commit -a -m 'Initial project'
  • 打標籤,注意此標籤可能在podspec中用到,用於區分版本

    git tag 0.0.1
  • 本地倉庫與遠程倉庫關聯

    git remote add origin <url>
  • 拉取和合並本地與遠程倉庫

    git pull origin master --allow-unrelated-histories
  • 本地倉庫代碼推送到遠程

    git push --set-upstream origin master
  • 推送標籤

    git push --tags

8.提交podspec文件

  1. 開源庫提交podspec文件到Cocopods官方倉庫, 固然須要如今ocopods官方倉庫中註冊帳號,命令以下:

    pod trunk me (檢查是否註冊trunk)
    pod trunk register <郵箱> <註冊名字> --verbose (註冊命令)

    註冊完成以後會給你的郵箱發個郵件,進入郵箱郵件裏面有個連接,須要點擊確認一下.以後開始提交,切換到有.podspec文件的組件工程根目錄執行命令

    pod trunk push <組件庫名>.podspec
    pod trunk push <組件庫名>.podspec --allow-warnings
  2. 私有庫提交podspec文件到遠程specs倉庫(第二步建立的specs遠程倉庫),和Cocopods官方庫不一樣的是,私有倉庫須要先添加到本地倉庫,再push到遠程倉庫,由於Cocopods默認已經添加到了本地倉庫(默認爲master),Mac系統能夠查看文件目錄(~/.cocoapods/repos), 私有庫命令以下:
  • 添加到本地倉庫, git@git.xxxx/.git爲遠程specs庫的地址,成功以後目錄(~/.cocoapods/repos)除了master以外,新增了一個文件夾(<組件庫名>)

    pod repo add <specs倉庫名> <specs遠程倉庫地址>
  • 查看是否添加成功

    pod repo list
  • push到遠程specs倉庫

    pod repo push <specs遠程倉庫地址> <組件庫名>.podspec

9. 檢查倉庫是否發佈成功

pod搜索一下:

pod search <組件庫名>

若是報錯,搜索不到,建議更新下pod:

pod update

以後仍然搜索不到,那麼進入CocoaPods緩存目錄,刪除緩存索引文件search_index.json:

cd ~/Library/Caches/CocoaPods
ls
rm -f search_index.json

10. pod庫文件引入

若是是開源庫(公有的),修改podfile文件:

pod '組件庫名'

若是是私有倉庫,建議在podfile文件開頭添加source源:

source 'https://github.com/CocoaPods/Specs.git'        #官方遠程倉庫地址
source ‘http://xxx/組件庫.git’        #私有podspecs遠程倉庫地址

最後執行命令進行安裝:

pod install

3、Cocoapods-packager插件打包庫

1.靜態庫和動態庫

  • 文件形式:

    • 常見形式:靜態庫常見的是 .a,動態庫常見的是 .dll(windows),.dylib(mac),tbd(mac,Xcode7開始),so(linux)
    • framework(Apple)形式: Framework 是Cocoa/Cocoa Touch程序中使用的一種資源打包方式,能夠將代碼文件、頭文件、資源文件、說明文檔等集中在一塊兒,方便開發者使用。 framework實際上是資源打包的方式,和靜態庫動態庫的本質是沒有關係。
  • 靜態庫和動態庫區別:

    • 靜態庫:連接時會被完整的複製到可執行文件中,因此若是兩個程序都用了某個靜態庫,那麼每一個二進制可執行文件裏面其實都含有這份靜態庫的代碼。
    • 動態庫: 連接時不復制,在程序啓動後用dyld加載,而後再決議符號,因此理論上動態庫只用存在一份,好多個程序均可以動態連接到這個動態庫上面,達到了節省內存(不是磁盤是內存中只有一份動態庫),還有另一個好處,因爲動態庫並不綁定到可執行程序上,因此咱們想升級這個動態庫就很容易,windows和linux上面通常插件和模塊機制都是這樣實現的。注意:蘋果開發中若是你把某個本身開發的動態庫(系統的不算,畢竟蘋果是爸爸)放在了Linked Frameworks and Libraries裏面,程序一啓動就會報Reason: Image Not Found,你只能把它放在Embeded Binaries裏面才能正常使用。
    • 靜態庫:一堆目標文件(.o/.obj)的打包體(並不是二進制文件)。
    • 動態庫: 一個沒有main函數的可執行文件。
  • 靜態庫和動態庫如何構建和加載

    • 編譯: 將咱們的源代碼文件編譯爲目標文件。
    • 連接: 將咱們的各類目標文件加上一些第三方庫,和系統庫連接爲可執行文件。連接這一步最主要的操做就是決議符號的地址。若符號來自靜態庫(本質就是.o 的集合包)或 .o,將其歸入連接產物,並肯定符號地址。若符號來自動態庫,打個標記,等啓動的時候再說---交給dyld去加載和連接符號。
    • 加載:靜態庫啓動時,動態庫使用時(啓動後。
  • 靜態庫和動態庫的依賴關係

    • 靜態庫之間保持獨立
    • 可執文件(主程序或者動態庫)在構建的連接階段遇到靜態庫吸附進來(吸附性) ,遇到動態庫打標記(彼此保持獨立)。 注意:若是不想讓動態庫吸附靜態庫,能夠把靜態庫包一層變成動態庫。
  • 查看Framework是不是動態庫
    在framework目錄之下,若是帶有dynamically標識着是動態庫, 不然是靜態庫,運行命令

    file xxxx.framework

參考連接:iOS動態庫和靜態庫分析

2.安裝打包插件

一般能夠經過Xcode(Xcodebuild)來打包靜態庫和動態庫,如今經過Cocopods插件(脫離Xcode)來打包

  • 直接經過gem命令安裝

    sudo gem install cocoapods-packager
  • 找到 Gemfile文件,添加下面一行:

    gem "cocoapods-packager"

    而後運行命令

    bundle install

2.打包庫

  • 運行打包命令,注意在podspec文件的目錄下, 默認生成靜態framework形式,而且類名和方法名會被加組件庫的前綴避免衝突(好比:SDK引入AFNetworking,本身的項目中也引用 AFNetworking,SDK經過此種方式打包會被添加前綴,如:PodWTNetworking_AFURLSessionManager)

    pod package xxxx.podspec
  • 能夠添加命令參數,運行一下命令查看

    pod package --help
    --force :強制覆蓋以前已經生成過的二進制庫
    --no-mangle :不添加符號前綴(由於默認是添加前綴,避免衝突,如:PodWTNetworking_AFURLSessionManager)
    --exclude-deps : 不包含依賴的符號表,生成動態庫的時候不能包含這個命令,靜態庫必定須要包含依賴的符號表。
    --embedded :生成靜態.framework
    --library : 生成靜態.a(默認目錄下只有.a,頭文件須要本身整理)
    --dynamic : 生成動態framework
    --configuration=Debug :表示生成的庫是debug仍是release,默認是release
    --spec-sources= https://xxxxx.git, https://github.com/CocoaPods/... :依賴庫的遠程specs,特別當依賴的庫是私有倉庫specs時須要添加

    示例:

    pod package WTNetworking.podspec --spec-sources= https://git.dev.tencent.com/w...://github.com/CocoaPods/Specs.git --force --library
  • ⚠️注意: 默認的符號添加前綴可能會形成問題:

    • 參考另外一個插件說明:cocoapods-mangle README.md,本人在測試的時候出現了問題,cocoapods-mangle插件直接處理AFNetworking就會報錯中不到屬性變量什麼的(這個變量是id類型,並遵循某個協議),因爲時間緣由沒有繼續探究(本人當前主要探究一個App多個SDK都引用OpenSSL 形成衝突的問題,哪位大佬有好的方案請下方留言),可是打包插件cocoapods-packager確沒什麼問題(測試過程發現packager會給類和常量添加前綴,不會給分類方法添加前綴)。
    • C語言格式的函數: 本人測試「AFQueryStringFromParameters」是能夠的並不會衝突。
    • 打包SDK依賴的時候,建議頭文件的引用寫在.m文件中,好比:SDK 引用了AFNetworking ,可是把【#import "AFNetworking.h"】 寫在了.h文件中並在打包的時候暴露了出來,可是在項目中有沒有直接用到AFNetworking,那麼就會提示找不到AFNetworking。

4、Cocopods其它插件

參考連接:Cocopods插件安裝及說明

參考連接

相關文章
相關標籤/搜索