iOS進階篇-關于CocoaPods

一、前言

CocoaPods is the dependency manager for Swift and Objective-C Cocoa projects. It has over ten thousand libraries and can help you scale your projects elegantly.
CocoaPods is built with Ruby and is installable with the default Ruby available on OS X. We recommend you do this.
Using the default Ruby install will require you to use sudo when installing gems. Further instructions are in the guides.

   CocoaPods大家都知道是用來管理第三方庫的重要工具。每種語言發展到一個階段,就會出現相應的依賴管理工具,例如 Java 語言的 Maven,nodejs 的 npm。Cocoapod的出現也是必然,方便的合并代碼,不必煩瑣地更新第三庫這些優點就不必再提了。所以我也使用了一段是時間,但是由于學習的比較瑣碎,所以就總結下,也作為自己的一份復習筆記吧。

(附上CocoaPods項目的源碼地址:https://github.com/CocoaPods/Specs
感謝這個偉大的團隊,讓我們使用上了這么好用的工具)
<另外關于cocoapods的方面,也建議瀏覽唐巧的博客里面內容很全:http://blog.devtang.com/2014/05/25/use-cocoapod-to-manage-ios-lib-dependency/>

二、幾個基本概念

  • Cocoa
    Cocoa是蘋果公司為Mac OS X所創建的原生面向對象的API,是Mac OS X上五大API之一(其它四個是Carbon、POSIX、X11和Java)。
  • CocoaPods
    CocoaPods是一個負責管理iOS項目中第三方開源庫的工具
  • Ruby
    CocoaPods是基于ruby ecosystem的,需要ruby環境,使用ruby的gem命令。所以我們的系統要有ruby環境。
  • Gem
    gem是一種文件組織的包,一般的ruby的很多插件都有由這種各種的包提供。
  • 所以如果需要開發Gem的包,那么我們就有Ruby的環境,但是ruby的運行又需要gem包的支持,所以有了下文。

三、安裝CoacoaPods

首先你需要安裝ruby,幸運的是MAC系統默認會自動安裝好ruby環境。
下面介紹常用的命令

//查看ruby的版本
ruby -v
//查看當前存在的ruby版本
rvm list known
安裝對應的ruby版本(這個過程非常緩慢,請耐心等待,我MAC當前的版本是2.2.0)
rvm install 2.2.0
//查看ruby的源
gem sources -l

//查看Gem的版本
gem -v
//升級Gem版本
sudo gem update --system

OSX 10.11以前的安裝命令
// 安裝cocoapods
sudo gem install cocoapods
OSX EL Capitan的安裝命令
//安裝
sudo gem install -n /usr/local/bin cocoapods
// 安裝制定版本
sudo gem install -n /usr/local/bin cocoapods -v 1.0.0
//Beta版本
sudo gem install -n /usr/local/bin cocoapods --pre
卸載coaoapods
sudo gem uninstall cocoapods

Pod命令部分
//查看當前cocoapods的版本,可以用來檢測cocoapod是否成功,我MAC(10.12)的系統當前的版本是1.1.1
pod --version
//pod安裝成功之后一個首先的操作就是執行命令(不是必須的)
將所有第三方的Podspec索引文件更新到本地的~/.cocoapods/repos目錄下
pod setup

因為中國的防火墻的原因,我們必須更換到ruby-china的鏡像

  1. 移除原來的源

gem soureces --remove https://rubygems.org/

  1. 添加新的源,之前一直都用淘寶源 https://ruby.taobao.org/ 但是聽說已經不更新維護。建議使用ruby-china的源

gem sources -a https://gems.ruby-china.org

  1. 驗證是否已經替換成功

gem sources -l

  1. 查看并升級Gem的版本,查考以上常見命令行。我當前MAC系統升級后的Gem版本為2.6.7。
  2. 更新Podspec的索引文件
    使用pod --version來驗證到目前為止的步驟是否是成功的。
    執行pod setup
    執行pod setup時,CocoaPods 會將第三方的podspec索引文件更新到本地的~/.cocoapods/repos目錄下
  • 如果沒有執行過 pod setup,那用戶根目錄下~找不到.cocoapods/repos目錄的,沒有創建這個目錄。
  • 如果執行 pod setup,并且命令沒有執行成功,那么會創建~/.cocoapods/repos目錄,只不過目錄是空的。
  • 如果執行 pod setup,并且命令執行成功,說明把github上的Podsepc文件更新到本地,那么會創建~/.cocoapods/repos目錄,并且repos目錄里有一個master目錄,這個master目錄保存的就是github上所有第三方開源庫的Podspec索引文件。

Attention:第一次執行pod setup特別慢,請耐心等待。


四、開始使用CocoaPods

A、關于Podfile

  1. Podfile是什么
    Podfile是cocoapods安裝第三方庫的依賴文件,其中定義cocoapod需要集成的第三庫已經對應的系統要求等信息。

  2. 關于 Podfile.lock
    Podfile.lock 應該加入到版本控制里面,不應該把這個文件加入到.gitignore中。因為Podfile.lock會鎖定當前各依賴庫的版本,之后如果多次執行pod install不會更改版本,要pod update才會改Podfile.lock了。這樣多人協作的時候,可以防止第三方庫升級時造成大家各自的第三方庫版本不一致。
    CocoaPods 的這篇 官方文檔 也在What is a Podfile.lock
    一節中介紹了Podfile.lock
    的作用,并且指出:

This file should always be kept under version control.

B、 Podfile的語法

  1. platform :ios, '7.0'
  • 指定了開源庫將被編譯在哪個的平臺iOS(默認是iOS, 還有 OS X, tvOS, watchOS) 以及對應的系統版本。注意:輸入平臺請都輸入小寫字母
  1. inhibit_all_warnings!

屏蔽cocoapods庫里面的所有警告,這個特性也能在子target里面定義,如果你需要屏蔽某個pod里面的警告也可以是這樣
pod 'TargetName', :inhibit_warnings => true

  1. use_frameworks!

a. 使用frameworks動態庫替換靜態庫鏈接
b. swift項目cocoapods默認是 use_frameworks
c. OC項目cocoapods默認是 #use_frameworks <#是注釋的意思>

  1. workspace

指定應該包含所有projects的Xcode workspace.
如果沒有顯示指定workspace并且在Podfile所在目錄只有一個project,那么project的名稱會被用作于workspace的名稱

  1. projet

默認情況下是沒有指定的,當沒有指定時,會使用Podfile目錄下與target同名的工程

  1. target 'XXX' do
    end

指定特定Target的依賴庫,可以嵌套子Target的依賴庫

  1. inherit! :search_paths

明確指定基層與父層的所有pod,默認是繼承的

  1. source

指定specs的位置,自定義添加自己的podspec。公司內部使用
cocoapods 官方source是隱式的需要的,一旦你指定了其他source 你就需要也把官方的指定上
例如:
source 'ssh://git@gitlab.9ijx.com:9830/iOS/Specs.git'
source 'https://github.com/CocoaPods/Specs.git'

  1. 依賴庫的基本寫法

pod 'AFNetworking', '~> 3.1.0' //高于3.1.0的版本,表示使用最新版本
pod 'AFNetworking' //不指定依賴庫版本,每次都獲取最新版本
pod 'AFNetworking', '3.1.0' //只使用3.1.0的版本
pod 'AFNetworking', '>3.1.0' //使用高于3.1.0的版本
pod 'AFNetworking', '>=3.1.0' //使用大于等于

  1. 自定義依賴庫的路徑

Using the files from a folder local to the machine
pod 'Alamofire', :path => '~/Documents/Alamofire'
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git'
To use a different branch of the repo:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :branch => 'dev'
To use a tag of the repo:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :tag => '3.1.1'
Or specify a commit:
pod 'Alamofire', :git => 'https://github.com/Alamofire/Alamofire.git', :commit => '0f506b1c45'

  1. Podfile的官方網址

https://guides.cocoapods.org/using/the-podfile.html

C、注意事項

  1. 不更新 podspec
    CocoaPods 在執行pod install和pod update
    時,會默認先更新一次podspec索引。使用--no-repo-update
    參數可以禁止其做索引更新操作。如下所示:

pod install --no-repo-update
pod update --no-repo-update

  1. 需要了解更多可以查閱官方文檔
    https://guides.cocoapods.org/

D、常見的podfile結構

  1. Simple Podfile


    SimpleExample
  2. More complex Podfile


    more complex Podfile.png

3.If you want multiple targets to share the same pods, use an abstract_target


abstract_target.png

4.There is implicit abstract target at the root of the Podfile, so you could write the above example as:


Abstract target at the root of the Podfile.png

五、附錄常見問題

  • You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory

這是因為你沒有使用管理員的身份運行,比如:gem update --system就需要管理員的權限,增加 sudo gem update --system就可以解決這個問題

  • gem sources -l的輸出結果,默認輸出結果

輸出結果
*** CURRENT SOURCES ***
https://rubygems.org/

  • pod --version出現-bash: pod: command not found

可能是你的系統OSX EL Capitan以后命令,所以你需要使用對應OSX EL Capitan,查考前面的常用的命令行。

*Performing a deep fetch of the master specs repo to improve future performance

遇到這個問題一般是在更新系統更新之后,先更新rubu,再更新了gem,之后更新cocoapods之后出現的。 是因為pod steup的時候創建master這個庫,沒成功,之后就算移除鏡像重新安裝的話 默認是從matser庫里獲取,導致安裝不成功。出現了之后,可以在終端執行下列語句,再重新執行pod setup。
解決辦法是移除master庫,重新創建。
rm -rf ~/.cocoapods/repos/master

  • pod setup 在執行時,會輸出Setting up CocoaPods master repo
    ,但是會等待比較久的時間。這步其實是 Cocoapods 在將它的信息下載到 ~/.cocoapods目錄下,如果你等太久,可以試著 cd 到那個目錄,用du -sh *來查看下載進度。
    查看進度.png

*關于 pod setup時出現以下錯誤:

Paste_Image.png

自己按照提示在終端輸入以下命令:
pod repo add master https://github.com/CocoaPods/Specs.git
Paste_Image.png

在網上查到的解決辦法:在終端輸入以下命令:

sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer

后面的地址你可以打開Xcode顯示包內容,找到那個文件夾拖到終端里面

還有一個更具體的解決的方法,親測有效
解決方法:
cd ~/.cocoapods/repos
git clone https://github.com/CocoaPods/Specs.git master
pod install
還可以嘗試
rm -fr ~/.cocoapods/repos/master
然后再一次
pod setup

1、安裝 RVM
RVM:Ruby Version Manager,Ruby版本管理器,包括Ruby的版本管理和Gem庫管理(gemset)

$ curl -L get.rvm.io | bash -s stable
等待一段時間后就可以成功安裝好 RVM。
$ source ~/.bashrc
$ source ~/.bash_profile
測試是否安裝正常
rvm -v

  • 系統更新到最新的系統(10.13)
    使用pod命令出現以下問題
    -bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad interpreter: No such file or directory
    image.png

    那么重新執行一遍原文中提到的步驟
    出現rvm命令不執行,找不到參考以上問題
    發現有新版本所以將ruby更新到2.4.png

    重新安裝可以解決絕大多數問題.png

    安裝完成后.png

補充部分Podfile的語法,轉自別人的簡書

source ‘URL’ : 指定鏡像倉庫的源
platform : iOS, ‘6.0’ : 指定所支持系統和最低版本
inhibit_all_warnings! :屏蔽所有warning
workspace ‘項目空間名’: 指定項目空間名
xcodeproj ‘工程文件名’:指定xcodeproj工程文件名
下面都是引入庫的語句:
pod ‘庫名’, : 引入庫,什么版本都可以(一般就是最新版本了)
pod ‘庫名’, ‘版本’ : 引入指定版本的庫,下面的運算符可以指定版本的范圍
還有> < >= <= :不解釋 ~ > : 從指定版本到倒數第二位版本號升1為止,比如 ‘~> 1.2.1’是指 1.2.1 <= 版本 < 1.3.0
pod ‘庫名’, :podspec => ‘podspec文件路徑’ : 指定導入庫的podspec文件路徑
pod ‘庫名’, :Git => ‘源碼git地址’ : 指定導入庫的源碼git地址
pod ‘庫名’, :tag => ‘tag名’ : 指定導入庫的Tag分支

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

推薦閱讀更多精彩內容

  • CocoaPods 是什么? CocoaPods 是一個負責管理 iOS 項目中第三方開源庫的工具。CocoaPo...
    朝洋閱讀 25,735評論 3 51
  • 項目組件化、平臺化是技術公司的共同目標,越來越多的技術公司推崇使用pod管理第三方庫以及私有組件,一方面使項目架構...
    swu_luo閱讀 22,090評論 0 39
  • 閱讀感悟: “the social misfit";"another conversation stopp...
    zdw301閱讀 301評論 0 0
  • 啊,你來了!真是勞累你了。”淑蘭老人的女兒荷芬慌忙上前扶住腳步沉重的有田老人。 “她在哪?”有田試圖挺起脊背,可終...
    阿協喜歡調八閱讀 308評論 0 0
  • 永遠熱淚盈眶
    初愛Z閱讀 280評論 0 0