Cocoapods總結(jié)

參考文檔:http://www.itdecent.cn/p/f79589c21dc4
http://www.itdecent.cn/p/b64b4fd08d3c
http://www.cnblogs.com/hankkk/p/5703050.html
http://www.itdecent.cn/p/a977c0a03bf4
文章內(nèi)容

1.Cocoapods介紹,作用及原理
2.Cocoapods安裝
3.Cocoapods使用
4.Cocoapods補(bǔ)充
5.Cocoapods徹底刪除(因?yàn)橹拔乙呀?jīng)裝過了,卸載重新走一遍)

一.Cocoapods介紹,作用及原理
介紹:CocoaPods是一個(gè)負(fù)責(zé)管理iOS項(xiàng)目中第三方開源庫的工具。

作用:更加便捷的添加管理更新第三庫的使用,如果不使用Cocoapods,一般需要以下操作

1:下載開源庫的源代碼并引入工程
2:向工程中添加開源庫使用到的framework
3:解決開源庫和開源庫以及開源庫和工程之間的依賴關(guān)系、檢查重復(fù)添加的framework等問題
4:如果開源庫有更新的時(shí)候,還需要將工程中使用的開源庫刪除,重新執(zhí)行前面的三個(gè)步驟,這樣的操作臺(tái)繁瑣

在使用CocoaPods后,我們只需要把用到的開源庫放到一個(gè)名為Podfile的文件中,然后執(zhí)行pod install就可以了,Cocoapods就會(huì)自動(dòng)將這些第三方開源庫的源碼下載下來,并且為我們的工程設(shè)置好響應(yīng)的系統(tǒng)依賴和編譯參數(shù)。

原理:CocoaPods的原理是將所有的依賴庫都放到另一個(gè)名為Pods的項(xiàng)目中,然后讓主項(xiàng)目依賴Pods項(xiàng)目,這樣,源碼管理工作都從主項(xiàng)目移到了Pods項(xiàng)目中。Pods項(xiàng)目最終會(huì)編譯成一個(gè)名為libPods.a的文件,主項(xiàng)目只需要依賴這個(gè).a文件即可。

二.Cocoapods安裝
1:設(shè)置ruby的軟件源(這是因?yàn)閞uby的軟件源rubygems.org因?yàn)槭褂脕嗰R遜的云服務(wù),被我天朝屏蔽了)
使用國內(nèi)淘寶的ruby鏡像, 命令如下

$ sudo gem sources -r https://rubygems.org/
$ sudo gem sources -a https://ruby.taobao.org/

驗(yàn)證是否安裝成功

$  gem sources -l
*** CURRENT SOURCES ***
https://ruby.taobao.org/

2:設(shè)置gem為最新版本
如果gem太老,可以嘗試用如下命令升級(jí)gem:

$  sudo gem update --system

升級(jí)成功后會(huì)提示:

Latest version currently installed. Aborting.

3:執(zhí)行安裝CocoaPods命令

$ sudo gem install  cocoapods

如果報(bào)以下錯(cuò)誤:

ERROR:  While executing gem ... (Errno::EPERM)

Operation not permitted - /usr/bin/xcodeproj

解決方案1:
執(zhí)行下面的命令并重啟

$ sudo nvram boot-args="rootless=0"
$ sudo reboot

重啟之后, 執(zhí)行這個(gè)命令檢查

$ sudo gem install cocoapods -V

如果依舊有錯(cuò)誤,使用第二個(gè)方案
解決方案2:

$ sudo gem install -n /usr/local/bin cocoapods

Mac OS mojave又有新錯(cuò)誤
錯(cuò)誤2:

Building native extensions. This could take a while...
ERROR:  Error installing cocoapods:
    ERROR: Failed to build gem native extension.

    current directory: /Library/Ruby/Gems/2.3.0/gems/ffi-1.12.2/ext/ffi_c
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby -r ./siteconf20200426-7198-a15w8j.rb extconf.rb
mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /Library/Ruby/Gems/2.3.0/gems/ffi-1.12.2 for inspection.
Results logged to /Library/Ruby/Gems/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.12.2/gem_make.out

解決:
打開/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

結(jié)果提示

The file /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg does not exist.

后面查找下,發(fā)現(xiàn)確實(shí)不存在,要先安裝

xcode-select --install

安裝完成后,再執(zhí)行上面open,再執(zhí)行sudo gem install cocoapods,再檢查版本看是否安裝完成$ sudo gem install cocoapods -V

$ pod setup

還有一點(diǎn)需要注意,pod setup在執(zhí)行時(shí),會(huì)輸出Setting up CocoaPods master repo,但是會(huì)等待比較久的時(shí)間。這步其實(shí)是 Cocoapods 在將它的信息下載到 ~/.cocoapods目錄下,如果你等太久,可以試著 cd 到那個(gè)目錄,用du -sh *來查看下載進(jìn)度。
(或者把別人的master文件拷貝過來)
安裝成功后,你會(huì)看到:

Setup completed

特別補(bǔ)充:網(wǎng)上之前看到有人遇到這個(gè)問題,http.postBuffer設(shè)置成500M還不夠大,設(shè)置成1024M才成功

下載了270M后的某個(gè)時(shí)候,又報(bào)錯(cuò):

Setting up CocoaPods master repo 
[!] /usr/bin/git clone https://github.com/CocoaPods/Specs.git master –depth=1 
Cloning into ‘master’… 
error: RPC failed; result=18, HTTP code = 200 
fatal: The remote end hung up unexpectedly 
fatal: early EOF 
fatal: index-pack failed

郁悶了,白等了好久,查資料后:

$ git config --global http.postBuffer 1073741824

$ git config --list
git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999 

重新執(zhí)行:

$ pod setup

pod install一直卡??;Analyzing dependencies
Cloning spec repo cocoapods from https://github.com/CocoaPods/Specs.git

新版的 CocoaPods 不允許用pod repo add直接添加master庫了,但是依然可以:

$ cd ~/.cocoapods/repos 
$ pod repo remove master
$ git clone https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git master

最后進(jìn)入自己的工程,在自己工程的podFile第一行加上:

source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'

完事之后記得remove trunk ,執(zhí)行下面的命令

pod repo remove trunk

如果不執(zhí)行remove還可能會(huì)出現(xiàn) CDN:trunk 的問題。
三.Cocoapods使用
1:新建項(xiàng)目CocoaPodsTest
2:cd 到項(xiàng)目路徑
3:創(chuàng)建或者編輯Podfile文件

$ vi Podfile

插入

i

插入內(nèi)容如下:

platform :ios, '8.0'

target 'JiHe' do
    pod 'MBProgressHUD'
    pod 'MJExtension'
    pod 'Reachability'
    pod 'SDWebImage'
    pod 'FMDB'
    pod 'Masonry'
    pod 'Reachability'
    pod 'pop'
    pod 'IQKeyboardManager'
    pod 'AFNetworking'
    pod 'AMap2DMap-NO-IDFA'
    pod 'AMapSearch-NO-IDFA'
    pod 'AMapLocation-NO-IDFA'
end

按Esc退出編輯,再:,輸入wq保存退出

:wq

四.Cocoapods補(bǔ)充
安裝和使用之后,可以看到,工程的根目錄下多了三個(gè)東西:CocoaPodsDemo.xcworkspace、Podfile.lock文件和Pods目錄。提示我們從現(xiàn)在起,我們需要使用CocoaPodsDemo.xcworkspace文件來進(jìn)行開發(fā)。對(duì)于Podfile.lock需要了解幾點(diǎn):

1:第一次 pod install 時(shí)生成記錄每個(gè) Pod 版本
2:Podfile.lock 鎖定當(dāng)前各依賴庫的版本之后 pod install 不會(huì)更改版本pod update 才會(huì)改版本
3:多人協(xié)作時(shí)防止第三方庫升級(jí)時(shí)造成版本不一致

pod install :

這個(gè)是第一次在工程里面使用pods的時(shí)候使用,并且,也是每次你編輯你的Podfile(添加、移除、更新)的時(shí)候使用。

每次運(yùn)行pod install命令的時(shí)候,在下載、安裝新的庫的同時(shí),也會(huì)把你安裝的每個(gè)庫的版本都寫在了Podfile.lock文件里面。這個(gè)文件記錄你每個(gè)安裝庫的版本號(hào),并且鎖定了這些版本。

當(dāng)你使用pod install它只解決了pods里面,但不在Podfile.lock文件里面的那些庫之間的依賴。對(duì)于在Podfile.lock里面所列出的那些庫,會(huì)下載在Podfile.lock里面明確的版本,并不會(huì)去檢查是否該庫有新的版本。對(duì)于還不在Podfile.lock里面的庫,會(huì)找到Podfile里面描述對(duì)應(yīng)版本(例如:pod "MyPod", "~>1.2")。

pod outdated:
當(dāng)你運(yùn)行pod outdated命令,CocoaPods會(huì)列出那些所有較Podfile.lock里面有新版本的庫(那些當(dāng)前被安裝著的庫的版本)。這個(gè)意思就是,如果你運(yùn)行pod update PODNAME,如果這個(gè)庫有新的版本,并且新版本仍然符合在Podfile里的限制,它就會(huì)被更新。

pod update:
當(dāng)你運(yùn)行 pod update PODNAME 命令時(shí),CocoaPods會(huì)幫你更新到這個(gè)庫的新版本,而不需要考慮Podfile.lock里面的限制,它會(huì)更新到這個(gè)庫盡可能的新版本,只要符合Podfile里面的版本限制。

如果你運(yùn)行pod update,后面沒有跟庫的名字,CocoaPods就會(huì)更新每一個(gè)Podfile里面的庫到盡可能的最新版本。

正確用法:

你應(yīng)該使用pod update PODNAME去只更新某個(gè)特定的庫(檢查是否有新版本,并盡可能更新到新的版本)。對(duì)應(yīng)的,你應(yīng)該使用pod install,這個(gè)命令不會(huì)更新那些已經(jīng)安裝了的庫。

當(dāng)你在你的Podfile里面添加了一個(gè)庫的時(shí)候,你應(yīng)該使用pod install,而不是pod update,這樣既安裝了這個(gè)庫,也不需要去更新其它的已安裝庫。

你應(yīng)該使用pod update去更新某個(gè)特定的庫,或者所有的庫(在Podfile的限制中)。

提交你的Podfile.lock文件:

在此提醒,即使你一向以來,不commit你的Pods文件夾到遠(yuǎn)程倉庫,你也應(yīng)該commit并push到遠(yuǎn)程倉庫中。

要不然,就會(huì)破壞整個(gè)邏輯,沒有了Podfile.lock限制你的Pods中的庫的版本。

舉例:

以下會(huì)舉例說明在各個(gè)場景下的使用。

場景1:User1創(chuàng)建了一個(gè)工程

User1創(chuàng)建了一個(gè)工程,并且想使用A、B、C這三個(gè)庫,所以他就創(chuàng)建了一個(gè)含有這個(gè)三個(gè)庫的Podfile,并且運(yùn)行了pod intall。

這樣就會(huì)安裝了A、B、C三個(gè)庫到這個(gè)工程里面,假設(shè)我們的版本都為1.0.0。

因此Podfile.lock跟蹤并記錄A、B、C這三個(gè)庫以及版本號(hào)1.0.0。

順便說一下:由于這個(gè)工程是第一次運(yùn)行pod install,并且Pods.xcodeproj工程文件還不存在,所以這個(gè)命令也會(huì)同時(shí)創(chuàng)建Pods.xcodeproj以及.xcworkspace工程文件,這只是這個(gè)命令的一個(gè)副作用,并不是主要目的。

場景2:User1添加了一個(gè)庫

之后,User1添加了一個(gè)庫D到Podfile文件中。

然后他就應(yīng)該運(yùn)行pod install命令了。所以即使庫B的開發(fā)者發(fā)布了B的一個(gè)新版本1.1.0。但只要是在第一次執(zhí)行pod install之后發(fā)布的,那么B的版本仍然是1.0.0。因?yàn)閁ser1只是希望添加一個(gè)新庫D,不希望更新庫B。

這就是很多人容易出錯(cuò)的地方,因?yàn)樗麄冊(cè)谶@里使用了pod update,因?yàn)橄胫案挛业墓こ桃粋€(gè)新的庫而已”。這里要注意!

場景3:User2加入到這個(gè)工程中

然后,User2,一個(gè)之前沒有參與到這個(gè)工程的人,加入了。他clone了一份倉庫,然后使用pod install命令。

Podfile.lock的內(nèi)容就會(huì)保證User1和User2會(huì)得到完全一樣的pods,前提是Podfile.lock被提交到git倉庫中。

即使庫C的版本已經(jīng)更新到了1.2.0,User2仍然會(huì)使用C的1.0.0版本,因?yàn)镃已經(jīng)在Podfile.lock里面注冊(cè)過了,C的1.0.0版本已經(jīng)被Podfile.lock鎖住了。

場景4:檢查某個(gè)庫的新版本

之后,User1想檢查pods里面是否有可用的更新時(shí),他執(zhí)行了pod outdated,這個(gè)命令執(zhí)行后,會(huì)列出來:B有了1.1.0版本,C有了1.2.0版本。

這時(shí)候,User1打算更新庫B,但不更新庫C,所以執(zhí)行pod update B,這樣就把B從1.0.0更新到1.1.0(同時(shí)更新Podfile.lock里面對(duì)B的版本記錄),此時(shí),C仍然是1.0.0版本,不會(huì)更新。

在Podfile中使用明確版本還不夠

有些人認(rèn)為在Podfile中明確某個(gè)庫的版本,例如:pod 'A', '1.0.0' ,足以保證所有項(xiàng)目里面的人都會(huì)使用完全一樣的版本。

這個(gè)時(shí)候,他們可能會(huì)覺得,此時(shí)如果添加一個(gè)新庫的時(shí)候,我使用pod update并不會(huì)去更新其它的庫,因?yàn)槠渌膸煲呀?jīng)被限定了固定的版本號(hào)。

但事實(shí)上,這不足以保證User1和User2的pods中庫的版本會(huì)完全一樣。

一個(gè)典型的例子是,如果庫A有一個(gè)對(duì)庫A2的依賴(聲明在A.podspec中:dependency 'A2', '~> 3.0'),如果這樣的話,使用 pod 'A', '1.0.0' 在你的Podfile中,的確會(huì)讓User1和User2都使用同樣版本的庫A(1.0.0),然而:

最后User1可能使用A的依賴庫A2的版本為3.4(因?yàn)?.4是當(dāng)時(shí)User1使用的最新版本),但User2使用的庫A2版本是3.5(假設(shè)A2的開發(fā)者剛剛發(fā)布了A2的新版本3.5)。

所以只有一個(gè)方法來保證某項(xiàng)目的每個(gè)開發(fā)者都使用相同版本的庫,就是每個(gè)電腦中都使用同樣的Podfile.lock,并且合理使用pod install 和 pod update。

五.Mac徹底刪除CocoaPods的方法
1:羅列依賴庫

$ gem list --local | grep cocoapods

顯示的依賴庫

cocoapods (1.2.1)
cocoapods-core (1.2.1)
cocoapods-deintegrate (1.0.1)
cocoapods-downloader (1.1.3)
cocoapods-plugins (1.0.0)
cocoapods-search (1.0.0)
cocoapods-stats (1.0.0)
cocoapods-trunk (1.2.0)
cocoapods-try (1.1.0)

2:遍歷刪除依賴庫

$ for i in $( gem list --local --no-version | grep cocoapods );
do 
   sudo   gem uninstall $i; 
done

輸入密碼,輸入Y確認(rèn)

Password:
Remove executables:
    pod, sandbox-pod

in addition to the gem? [Yn]  Y

刪除成功

Removing pod
Removing sandbox-pod
Successfully uninstalled cocoapods-1.2.1
Successfully uninstalled cocoapods-core-1.2.1
Successfully uninstalled cocoapods-deintegrate-1.0.1
Successfully uninstalled cocoapods-downloader-1.1.3
Successfully uninstalled cocoapods-plugins-1.0.0
Successfully uninstalled cocoapods-search-1.0.0
Successfully uninstalled cocoapods-stats-1.0.0
Successfully uninstalled cocoapods-trunk-1.2.0
Successfully uninstalled cocoapods-try-1.1.0

3:進(jìn)一步徹底刪除文件夾

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

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

  • 一、預(yù)備知識(shí) 1、Rvm介紹:全稱 Ruby Version Manager,是安裝和管理ruby的一種工具。(下...
    xx明閱讀 1,342評(píng)論 0 2
  • 項(xiàng)目組件化、平臺(tái)化是技術(shù)公司的共同目標(biāo),越來越多的技術(shù)公司推崇使用pod管理第三方庫以及私有組件,一方面使項(xiàng)目架構(gòu)...
    swu_luo閱讀 22,847評(píng)論 0 39
  • Ruby 安裝 要安裝cocospods 首先需要安裝ruby,可以先安裝xcode,再安裝macport ,最后...
    山天大畜閱讀 2,118評(píng)論 0 1
  • 雙十一是購物狂歡節(jié),當(dāng)11號(hào)到來那一刻,我便聽到“快搶”的一聲從隔壁宿舍傳出來,這是在參與某寶購物節(jié)的人兒。有人會(huì)...
    iceyang閱讀 186評(píng)論 0 1
  • 2017.3.21 昨天超級(jí)忙碌,從早上到晚上的課程,還有忘記的作業(yè),在地鐵上用手機(jī),打了一千多的作業(yè),回到學(xué)校整...
    薇糖糖糖閱讀 178評(píng)論 0 0

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