CocoaPods

一、基礎操作

CocoaPods 簡單說就是項目依賴框架(包括第三方庫和私有庫)自動化管理工具,其通過 Podfile 文件描述項目依賴框架,然后自動下載框架源碼,創建 workspace 來構建項目。

1. 安裝 CocoaPods

CocoaPods 是用 ruby 寫的,Mac OS 中默認有 ruby,可以直接通過 ruby 包管理工具 gem 來安裝,安裝時需要系統命令 sudo 來獲取管理員權限。

$ sudo gem install cocoapods

安裝過程可能遇到的問題及解決方法

2. CocoaPods 使用

2.1 創建 Podfile 文件

$ pod init
# cd 到項目目錄,pod init 命令會生成帶模版的 Podfile 文件。

2.2 在 Podfile 文件中輸入描述依賴庫的相關信息,使用 ruby 來寫,Podfile 文件官方介紹Podfile 語法官方介紹

Podfile 中可能包含的關鍵字:

source,指定從哪些倉庫中獲取依賴庫的索引文件(podspec),開源庫可以不指定,私有庫必須指定

# CocoaPods 管理的開源庫
source 'https://github.com/CocoaPods/Specs.git'
# 私有庫
source 'git@git.ipo.com/Spec.git'

platform,指定平臺,及 SDK 的版本號

platform:ios,'7.0'
# 一般要指定平臺和版本號,如果不指定,默認是 ios、osx、tvos watchos 全平臺,但相應平臺的 sdk 版本會很低,可能滿足不了依賴庫的版本要求,會編譯通不過。

target,指定配置是適配項目中哪個 target(一個項目中可能有多個 target)

# 例1
target 'AppTarget' do
    pod 'AFNetworking' '~> 7.0'
    target 'AppTestTarget' do 
        pod 'TestPod'
    end
end

# 例2
# There are no targets called "CommonPods" in any Xcode projects
abstract_target 'CommonPods' do
    pod 'common_pod1'
    pod 'common_pod2'
    # Has its own copy of target1_pod1
    target 'target1' do
        pod 'target1_pod1'
    end
    # Has its own copy of target2_pod1
    target 'target2' do
        pod 'target2_pod1'
    end
end
# 其中,common_pod1,common_pod2 是多個 target 共享的第三方庫

# 例3(多個 target 共享 pods 隱式寫法)
pod 'Common_pod1'
pod 'Common_pod2'
target 'target1' do
    pod 'target1_pod1'
end
target 'target2' do
    pod 'target2_pod1'
end

pod,用來指定依賴庫及依賴庫的版本

pod 'AFNetworking', '~> 3.0'
# 如果沒有指定版本,默認為最新版本,可以指定固定版本好,也可以通過關系運算符指定版本范圍。
'> 0.1' Any version higher than 0.1
'>= 0.1' Version 0.1 and any higher version
'< 0.1' Any version lower than 0.1
'<= 0.1' Version 0.1 and any lower version
'~> 0.1.2' Version 0.1.2 and the versions up to 0.2, not including 0.2 and higher, 指定范圍內最新的版本
'~> 0.1' Version 0.1 and the versions up to 1.0, not including 1.0 and higher, 指定范圍內最新的版本
'~> 0' Version 0 and higher, this is basically the same as not having it.

pod 'AFNetworking', :path => '~/Documents/AFNetworking'
# 指定本地路徑為依賴庫的源,CocoaPods 會在項目中直接引用這些文件,并且會隨著這些文件的更新而自動更新,但是指定路徑的 root path 中必須有相應依賴庫的 podspec(這個參數主要用于同時進行開發的依賴庫)。

有時我們需要引入依賴庫指定的分支或者節點:
# 引入 master 分支(默認)
pod 'AFNetworking', :git => 'https://github.com/AFNetworking.git'
# 引入指定分支
pod 'AFNetworking', :git => 'https://github.com/AFNetworking.git', :branch => 'dev'
# 引入某個 tag 的代碼
pod 'AFNetworking', :git => 'https://github.com/AFNetworking.git', :tag => '1.0.0'
# 引入某個 commit 節點
pod 'AFNetworking', :git => 'https://github.com/AFNetworking.git', :commit => '082f8319af'

subspecs,指定依賴庫的子模塊,
# 僅安裝 AppKit 庫下的 Model1 
pod 'AppKit/Model1'
# 安裝 AppKit 庫下的 Model1,Model2 和 Model3
pod 'AppKit', :subspecs => ['Model1', 'Model2', 'Model3']

# 指定新生成的 workspace 的名字,默認與 project name 相同
workspace 'WorkspaceName'

# ToDo podspec

常見的 Podfile 文件內容格式:

# 指定依賴庫的來源地址(包括開源庫和私有庫)
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/Artsy/Specs.git'

# 指定平臺和 sdk 版本號
platform:ios, '8.0'

# 忽略依賴庫的所有警告
inhibit_all_warnings!

# 針對 App target 引入 AFNetworking
# 針對 TestApp target 引入 TestPod
target 'App' do
    # 如果指定 use_frameworks 會在 Pods 項目中的 product 中生成 framework,否則生成靜態文件(.a文件)
    use_frameworks
    pod 'AFNetworking', '~> 3.0'
    target 'TestApp' do
        pod 'TestPod'
    end
end

# 只是 CocoaPods 的一些配置,官網并沒有詳細的說明,一般采取默認就好了,也就是不寫
post_install do |installer|
    installer.pods_project.targets.each do |target|
        puts target.name
    end
end

2.3 構造依賴庫及 workspace

$ pod install

執行 pod install 后,項目目錄中會生成 Podfile.lock、app.xcworkspace 和 pods 文件夾(包含 Pods.xcodeproj)。

pod install VS pod update

參考

初次 pod install,會將 Podfile 文件中 source 指定的 url 中的所有依賴庫的索引(podspec)都 clone 到本地目錄中(~/.cocoapods/repos),所以會非常慢,podspec 文件下載完后,會繼續根據 Podfile 中的依賴庫信息(pod)找到相應的 podspec 文件,然后根據 podspec 中的配置信息下載安裝對應的依賴庫,并把已經安裝的依賴庫的版本號寫入 Podfile.lock 文件。

以后,每次 pod install/update 操作,都會先去更新本地 podspec 索引庫,如果不想每次都去下載 podspec 文件可以加參數 --no-repo-update

對 Podfile 文件進行增刪改后,再進行 pod install,如果 Podfile.lock 中的版本滿足 Podfile 中的描述要求,就直接使用 Podfile.lock 中的版本,如果不滿足就重新下載安裝,重新下載安裝后,在將新版本號更新到 Podfile.lock 文件中。

pod update 命令,如果依賴庫有新版本且滿足 Podfile 描述,就會下載安裝新版本的依賴庫,并把版本號更新到 Podfile.lock 文件。

pod outdated 命令,會列出所有相對于已安裝的依賴庫版本(即 Podfile.lock 文件中寫入的版本),有新的版本的依賴庫及最新版本號。

Podfile.lock 文件的作用:統一團隊中每個開發者使用的依賴庫的版本號,所以需要將 Podfile 和 Podfile.lock 都 push 到 repo 上。

2.4 以 workspace 方式打開項目

$ open app.xcworkspace
// 也可以通過雙擊 app.xcworkspace 來打開

二、構建私有庫

官方介紹

參考一

參考二

參考三

1. 創建一個私有 git 倉庫用于管理私有庫代碼

創建私有庫 git 倉庫,然后進行開發、commit、打 tag 等操作。

2. 創建另一個私有 git 倉庫用于管理私有庫的索引文件 — podspec

可以在 github、sourcing、csdn 及 自己搭建的 git 服務器(gitlab)上創建 git 倉庫。

2. 將私有庫添加到 cocoapods

$ pod repo add REPO_NAME SOURCE_URL

# 其中 REPO_NAME,就是私有庫 repo name,SOURCE_URL 是 podspec 倉庫地址。命令執行后,會在 ~/.cocoapods/repos 目錄下新生成一個 REPO_NAME 文件夾,并且將 SOURCE_URL clone 到該文件夾下。另外,~/.cocoapods/repos 文件夾下至少還會有一個 master 文件夾(如果 pod install 過的話),master 文件夾是 cocoapods 官方的 repo。 

$ cd ~/.cocoapods/repos/REPO_NAME
$ pod repo lint .

可以通過上述命令檢驗私有庫是否添加成功。

3. 創建私有庫索引文件 podspec(包括驗證)

$ pod spec create POD_SPEC_NAME

# POD_SPEC_NAME 就是第一步創建的私有庫的名字,該命令會創建一個 POD_SPEC_NAME.podspec 文件,文件是一個模版文件,其中包含包括 name、version、source 等私有庫描述信息,只要進行替換就行了。

$ pod lib lint

# cd 到 POD_SPEC_NAME.podspec 文件所在的根目錄,然后運行 pod lib lint 去驗證,驗證 podspec 描述的私有庫是否有效、是否可獲取等。

4. 將私有庫索引文件添加到 repo 并推送到服務器

$ pod repo push REPO_NAME POD_SPEC_NAME.podspec

# 該命令會先執行一遍驗證,即 pod lib lint,然后在 REPO_NAME 文件夾中創建 POD_SPEC_NAME/version/POD_SPEC_NAME.podspec,最后會將該目錄路徑推送到 SOURCE_URL 指定的 git repo 。

# 如果有警告,導致驗證不通過,可以添加參數 --allow-warnings,忽略警告。

$ pod search POD_NAME

# 該命令可以用來驗證私有庫是否添加成功,其中,POD_NAME 就是我們添加的私有庫的名稱。如果搜索到庫信息,說明添加成功,否則失敗。

5. 使用 pod 在 Podfile 添加私有庫來構建項目

在 Podfile 文件中,使用 source 來指定私有庫索引文件(podspec)的 git 倉庫 URL。使用 pod 來安裝私有庫。

三、將開源庫在 cocoapods 中進行注冊

官方介紹

1. 注冊 cocoapods 賬號

$ pod trunk register EMAIL_ADDRESS 'ALIAS' --description='Macbook pro'

# 想要向 cocoapods 注冊開源庫,肯定需要一個賬號
# 注冊成功后 cocoapods 會向注冊的郵箱發送確認郵件

2. 將開源庫部署到 cocopods上

$ pod trunk push [NAME.podspec]

# 該命令會將 podspec 部署到 cocoapos 上,并對外公開
# trunk 會在生成一個 JSON 后綴的 podspec 文件

$ pod trunk add-owner FRAMEWORK_NAME EMAIL_ADDRESS

# 該命令是給 cocoapods 注冊的開源庫增加管理者

注:
如果已經寫好了開源庫,可以是用上述流程;如果還沒有寫開源庫,可以使用 pod lib create PROJECT_NAME 命令創建開源庫,該命令會創建一個 Pod 所需要的所有文件、模版及 Example。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容