參考文檔:http://www.lxweimin.com/p/f79589c21dc4
http://www.lxweimin.com/p/b64b4fd08d3c
http://www.cnblogs.com/hankkk/p/5703050.html
http://www.lxweimin.com/p/a977c0a03bf4
文章內容
1.Cocoapods介紹,作用及原理
2.Cocoapods安裝
3.Cocoapods使用
4.Cocoapods補充
5.Cocoapods徹底刪除(因為之前我已經裝過了,卸載重新走一遍)
一.Cocoapods介紹,作用及原理
介紹:CocoaPods是一個負責管理iOS項目中第三方開源庫的工具。
作用:更加便捷的添加管理更新第三庫的使用,如果不使用Cocoapods,一般需要以下操作
1:下載開源庫的源代碼并引入工程
2:向工程中添加開源庫使用到的framework
3:解決開源庫和開源庫以及開源庫和工程之間的依賴關系、檢查重復添加的framework等問題
4:如果開源庫有更新的時候,還需要將工程中使用的開源庫刪除,重新執(zhí)行前面的三個步驟,這樣的操作臺繁瑣
在使用CocoaPods后,我們只需要把用到的開源庫放到一個名為Podfile的文件中,然后執(zhí)行pod install就可以了,Cocoapods就會自動將這些第三方開源庫的源碼下載下來,并且為我們的工程設置好響應的系統依賴和編譯參數。
原理:CocoaPods的原理是將所有的依賴庫都放到另一個名為Pods的項目中,然后讓主項目依賴Pods項目,這樣,源碼管理工作都從主項目移到了Pods項目中。Pods項目最終會編譯成一個名為libPods.a的文件,主項目只需要依賴這個.a文件即可。
二.Cocoapods安裝
1:設置ruby的軟件源(這是因為ruby的軟件源rubygems.org因為使用亞馬遜的云服務,被我天朝屏蔽了)
使用國內淘寶的ruby鏡像, 命令如下
$ sudo gem sources -r https://rubygems.org/
$ sudo gem sources -a https://ruby.taobao.org/
驗證是否安裝成功
$ gem sources -l
*** CURRENT SOURCES ***
https://ruby.taobao.org/
2:設置gem為最新版本
如果gem太老,可以嘗試用如下命令升級gem:
$ sudo gem update --system
升級成功后會提示:
Latest version currently installed. Aborting.
3:執(zhí)行安裝CocoaPods命令
$ sudo gem install cocoapods
如果報以下錯誤:
ERROR: While executing gem ... (Errno::EPERM)
Operation not permitted - /usr/bin/xcodeproj
解決方案1:
執(zhí)行下面的命令并重啟
$ sudo nvram boot-args="rootless=0"
$ sudo reboot
重啟之后, 執(zhí)行這個命令檢查
$ sudo gem install cocoapods -V
如果依舊有錯誤,使用第二個方案
解決方案2:
$ sudo gem install -n /usr/local/bin cocoapods
Mac OS mojave又有新錯誤
錯誤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 /
結果提示
The file /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg does not exist.
后面查找下,發(fā)現確實不存在,要先安裝
xcode-select --install
安裝完成后,再執(zhí)行上面open,再執(zhí)行sudo gem install cocoapods,再檢查版本看是否安裝完成$ sudo gem install cocoapods -V
$ pod setup
還有一點需要注意,pod setup在執(zhí)行時,會輸出Setting up CocoaPods master repo,但是會等待比較久的時間。這步其實是 Cocoapods 在將它的信息下載到 ~/.cocoapods目錄下,如果你等太久,可以試著 cd 到那個目錄,用du -sh *來查看下載進度。
(或者把別人的master文件拷貝過來)
安裝成功后,你會看到:
Setup completed
特別補充:網上之前看到有人遇到這個問題,http.postBuffer設置成500M還不夠大,設置成1024M才成功
下載了270M后的某個時候,又報錯:
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
最后進入自己的工程,在自己工程的podFile第一行加上:
source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git'
完事之后記得remove trunk ,執(zhí)行下面的命令
pod repo remove trunk
如果不執(zhí)行remove還可能會出現 CDN:trunk 的問題。
三.Cocoapods使用
1:新建項目CocoaPodsTest
2:cd 到項目路徑
3:創(chuàng)建或者編輯Podfile文件
$ vi Podfile
插入
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補充
安裝和使用之后,可以看到,工程的根目錄下多了三個東西:CocoaPodsDemo.xcworkspace、Podfile.lock文件和Pods目錄。提示我們從現在起,我們需要使用CocoaPodsDemo.xcworkspace文件來進行開發(fā)。對于Podfile.lock需要了解幾點:
1:第一次 pod install 時生成記錄每個 Pod 版本
2:Podfile.lock 鎖定當前各依賴庫的版本之后 pod install 不會更改版本pod update 才會改版本
3:多人協作時防止第三方庫升級時造成版本不一致
pod install :
這個是第一次在工程里面使用pods的時候使用,并且,也是每次你編輯你的Podfile(添加、移除、更新)的時候使用。
每次運行pod install命令的時候,在下載、安裝新的庫的同時,也會把你安裝的每個庫的版本都寫在了Podfile.lock文件里面。這個文件記錄你每個安裝庫的版本號,并且鎖定了這些版本。
當你使用pod install它只解決了pods里面,但不在Podfile.lock文件里面的那些庫之間的依賴。對于在Podfile.lock里面所列出的那些庫,會下載在Podfile.lock里面明確的版本,并不會去檢查是否該庫有新的版本。對于還不在Podfile.lock里面的庫,會找到Podfile里面描述對應版本(例如:pod "MyPod", "~>1.2")。
pod outdated:
當你運行pod outdated命令,CocoaPods會列出那些所有較Podfile.lock里面有新版本的庫(那些當前被安裝著的庫的版本)。這個意思就是,如果你運行pod update PODNAME,如果這個庫有新的版本,并且新版本仍然符合在Podfile里的限制,它就會被更新。
pod update:
當你運行 pod update PODNAME 命令時,CocoaPods會幫你更新到這個庫的新版本,而不需要考慮Podfile.lock里面的限制,它會更新到這個庫盡可能的新版本,只要符合Podfile里面的版本限制。
如果你運行pod update,后面沒有跟庫的名字,CocoaPods就會更新每一個Podfile里面的庫到盡可能的最新版本。
正確用法:
你應該使用pod update PODNAME去只更新某個特定的庫(檢查是否有新版本,并盡可能更新到新的版本)。對應的,你應該使用pod install,這個命令不會更新那些已經安裝了的庫。
當你在你的Podfile里面添加了一個庫的時候,你應該使用pod install,而不是pod update,這樣既安裝了這個庫,也不需要去更新其它的已安裝庫。
你應該使用pod update去更新某個特定的庫,或者所有的庫(在Podfile的限制中)。
提交你的Podfile.lock文件:
在此提醒,即使你一向以來,不commit你的Pods文件夾到遠程倉庫,你也應該commit并push到遠程倉庫中。
要不然,就會破壞整個邏輯,沒有了Podfile.lock限制你的Pods中的庫的版本。
舉例:
以下會舉例說明在各個場景下的使用。
場景1:User1創(chuàng)建了一個工程
User1創(chuàng)建了一個工程,并且想使用A、B、C這三個庫,所以他就創(chuàng)建了一個含有這個三個庫的Podfile,并且運行了pod intall。
這樣就會安裝了A、B、C三個庫到這個工程里面,假設我們的版本都為1.0.0。
因此Podfile.lock跟蹤并記錄A、B、C這三個庫以及版本號1.0.0。
順便說一下:由于這個工程是第一次運行pod install,并且Pods.xcodeproj工程文件還不存在,所以這個命令也會同時創(chuàng)建Pods.xcodeproj以及.xcworkspace工程文件,這只是這個命令的一個副作用,并不是主要目的。
場景2:User1添加了一個庫
之后,User1添加了一個庫D到Podfile文件中。
然后他就應該運行pod install命令了。所以即使庫B的開發(fā)者發(fā)布了B的一個新版本1.1.0。但只要是在第一次執(zhí)行pod install之后發(fā)布的,那么B的版本仍然是1.0.0。因為User1只是希望添加一個新庫D,不希望更新庫B。
這就是很多人容易出錯的地方,因為他們在這里使用了pod update,因為想著“更新我的工程一個新的庫而已”。這里要注意!
場景3:User2加入到這個工程中
然后,User2,一個之前沒有參與到這個工程的人,加入了。他clone了一份倉庫,然后使用pod install命令。
Podfile.lock的內容就會保證User1和User2會得到完全一樣的pods,前提是Podfile.lock被提交到git倉庫中。
即使庫C的版本已經更新到了1.2.0,User2仍然會使用C的1.0.0版本,因為C已經在Podfile.lock里面注冊過了,C的1.0.0版本已經被Podfile.lock鎖住了。
場景4:檢查某個庫的新版本
之后,User1想檢查pods里面是否有可用的更新時,他執(zhí)行了pod outdated,這個命令執(zhí)行后,會列出來:B有了1.1.0版本,C有了1.2.0版本。
這時候,User1打算更新庫B,但不更新庫C,所以執(zhí)行pod update B,這樣就把B從1.0.0更新到1.1.0(同時更新Podfile.lock里面對B的版本記錄),此時,C仍然是1.0.0版本,不會更新。
在Podfile中使用明確版本還不夠
有些人認為在Podfile中明確某個庫的版本,例如:pod 'A', '1.0.0' ,足以保證所有項目里面的人都會使用完全一樣的版本。
這個時候,他們可能會覺得,此時如果添加一個新庫的時候,我使用pod update并不會去更新其它的庫,因為其它的庫已經被限定了固定的版本號。
但事實上,這不足以保證User1和User2的pods中庫的版本會完全一樣。
一個典型的例子是,如果庫A有一個對庫A2的依賴(聲明在A.podspec中:dependency 'A2', '~> 3.0'),如果這樣的話,使用 pod 'A', '1.0.0' 在你的Podfile中,的確會讓User1和User2都使用同樣版本的庫A(1.0.0),然而:
最后User1可能使用A的依賴庫A2的版本為3.4(因為3.4是當時User1使用的最新版本),但User2使用的庫A2版本是3.5(假設A2的開發(fā)者剛剛發(fā)布了A2的新版本3.5)。
所以只有一個方法來保證某項目的每個開發(fā)者都使用相同版本的庫,就是每個電腦中都使用同樣的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確認
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:進一步徹底刪除文件夾
$ rm -rf ~/.cocoapods/