一、前言
公司的項目需要特定的cocopods版本才能正常集成,用其他版本運行會報錯,但再做新項目時必須要最新的cocopods版本才行,所以每次都是卸了重裝cocopods,很是麻煩,消耗了大量的時間。於是研究了一下自由切換pod版本的功能。以下之前的刪除重裝的方法
列出目前gem中安裝的所有Cocoapods的組件
gem list --local | grep cocoapods
可能會看到這樣的命令行輸出
cocoapods (1.5.3) cocoapods-core (1.5.3) cocoapods-deintegrate (1.0.4) cocoapods-downloader (1.2.2) cocoapods-plugins (1.0.0) cocoapods-search (1.0.0) cocoapods-stats (1.1.0) cocoapods-trunk (1.4.0) cocoapods-try (1.1.0)
然后需要一個個的卸載一遍
gem uninstall cocoapods
gem uninstall cocoapods-core gem uninstall cocoapods-deintegrate gem uninstall cocoapods-downloader gem uninstall cocoapods-plugins gem uninstall cocoapods-search gem uninstall cocoapods-stats gem uninstall cocoapods-trunk gem uninstall cocoapods-try
查看所有的Cocoapods版本 https://rubygems.org/gems/cocoapods/versions
然后再重新安裝一遍需要的特定版本Cocoapods
sudo gem install cocoapods -v 1.7.5
二、使用rvm切換pod
1、gem介紹
首先我們從 cocoapods 是如何安裝的入手分析。sudo gem install cocoapods
這段代碼是最基本的安裝命令,執行后會安裝最新的 cocoapods 版本。注意到,用的是 gem 命令,gem 又是個啥呢?
gem 是封裝起來的 Ruby 應用程序或代碼庫,終端使用的 gem 命令,是指通過 RubyGems 管理 Gem 包。也就是說 cocoapods 是一個 Ruby 代碼包,用 gem 來安裝。
如果有個管理工具,可以安裝和管理多個 Ruby 環境,在每個 Ruby 環境中,用 gem 安裝 cocoapods,不就實現了不同版本的 cocoapods 共存了嗎?ruby 剛好有個版本管理工具,可以做到這一點。
2、RVM介紹
RVM 用於幫助你安裝 Ruby 環境,幫你管理多個 Ruby 環境,幫你管理你開發的每個 Ruby 應用使用機器上哪個 Ruby 環境。
總結下來就是,使用 RVM 安裝不同版本的 Ruby 環境,在每個環境中安裝 cocoapods,此時每個 Ruby 環境中的 cocoapods 可以不同。
3、卸載當前機器上的 cocoapods
- 終端輸入
gem list
,查看當前 gem 下安裝的所有包 - 輸入命令
sudo gem uninstall XXX
,XXX 是你要卸載的包名 - 卸載第一步中所有 cocoapods 開頭的包
- 反復執行前面幾步,直到所有的 cocoapods 開頭的包都已經被卸載了
4、安裝 rvm 和多個版本的 Ruby
1)安裝 rvm,使用命令
curl -L get.rvm.io | bash -s stable && source ~/.rvm/scripts/rvm
2)到 https://rvm.io/binaries 下載相應版本的 ruby 包。選擇 osx/10.12/x86_64/

執行安裝命令
rvm mount ~/Downloads/ruby-2.2.3.tar.bz2
其中 ruby-2.2.3.tar.bz2
是你下載好的 ruby 包,按自己的需求可以多安裝幾個版本。由於該網站資源比較少,也可以使用命名下載。
查看已知ruby版本
rvm list known
選擇需要安裝的版本
rvm install 2.6.3
3)切換ruby版本
執行 rvm list
可查看當前安裝的 ruby 版本列表,執行 rvm use <Version>
可切換到不同版本的 ruby。使用 rvm use <Version> --default
,可設置默認 ruby 版本。

5、某個 ruby 版本下,安裝指定版本的 cocoapods
首先切換自己需要安裝cocoapods的ruby版本,執行安裝cocoapods命令
如果你是 mac 的 10.11 及以上系統,需要使用命令
sudo gem install cocoapods -v <Version> -n /usr/local/bin
例如命令 sudo gem install cocoapods -v 1.5.3 -n /usr/local/bin
否則的話使用命令
sudo gem install cocoapods -v <Version>
安裝成功后,可通過 gem list
或者 pod --version
,查看對應的 cocoapods 信息。
6、指令補充及遇到的問題
常用指令介紹,如遇到權限問題,可以在前面添加 sudo
指令
ruby rvm 常用指令
$ ruby -v # 查看ruby 版本
$ rvm list known # 列出已知的 ruby 版本
$ rvm install 2.3.0 # 選擇指定 ruby 版本進行更新
$ rvm get stable # 更新 rvm
$ rvm use 2.2.2 # 切換到指定 ruby 版本
$ rvm use 2.2.2 --default # 設置指定 ruby 版本為默認版本
$ rvm list # 查詢已安裝的 ruby 版本
$ rvm remove 1.9.2 # 卸載移除 指定 ruby 版本
$ curl -L https://get.rvm.io | bash -s stable # 安裝 rvm 環境
$ curl -sSL https://get.rvm.io | bash -s stable --ruby # 默認安裝 rvm 最新版本
$ curl -sSL https://get.rvm.io | bash -s stable --ruby=2.3.0 # 安裝 rvm 指定版本
$ source ~/.rvm/scripts/rvm # 載入 rvm
Gem
$ gem -v # 查看 gem 版本
$ gem source # 查看 gem 配置源
$ gem source -l # 查看 gem 配置源目錄
$ gem sources -a url # 添加 gem 配置源(url 需換成網址)
$ gem sources --add url # 添加 gem 配置源(url 需換成網址)
$ gem sources -r url # 刪除 gem 配置源(url 需換成網址)
$ gem sources --remove url # 刪除 gem 配置源(url 需換成網址)
$ gem update # 更新 所有包
$ gem update --system # 更新 Ruby Gems 軟件
$ gem install rake # 安裝 rake,從本地或遠程服務器
$ gem install rake --remote # 安裝 rake,從遠程服務器
$ gem install watir -v 1.6.2 # 安裝 指定版本的 watir
$ gem install watir --version 1.6.2 # 安裝 指定版本的 watir
$ gem uninstall rake # 卸載 rake 包
$ gem list d # 列出 本地以 d 打頭的包
$ gem query -n ''[0-9]'' --local # 查找 本地含有數字的包
$ gem search log --both # 查找 從本地和遠程服務器上查找含有 log 字符串的包
$ gem search log --remoter # 查找 只從遠程服務器上查找含有 log 字符串的包
$ gem search -r log # 查找 只從遠程服務器上查找含有log字符串的包
$ gem help # 提醒式的幫助
$ gem help install # 列出 install 命令 幫助
$ gem help examples # 列出 gem 命令使用一些例子
$ gem build rake.gemspec # 把 rake.gemspec 編譯成 rake.gem
$ gem check -v pkg/rake-0.4.0.gem # 檢測 rake 是否有效
$ gem cleanup # 清除 所有包舊版本,保留最新版本
$ gem contents rake # 顯示 rake 包中所包含的文件
$ gem dependency rails -v 0.10.1 # 列出 與 rails 相互依賴的包
$ gem environment # 查看 gem 的環境
$ sudo gem -v # 查看 gem 版本(以管理員權限)
$ sudo gem install cocoa pods # 安裝 CocoaPods(以管理員權限)
$ sudo gem install cocoapods # 安裝 CocoaPods(以管理員權限)
$ sudo gem install cocoapods --pre # 安裝 CocoaPods 至預覽版(以管理員權限)
$ sudo gem install cocoapods -v 0.39.0 # 安裝 CocoaPods 指定版本(以管理員權限)
$ sudo gem update cocoapods # 更新 CocoaPods 至最新版(以管理員權限)
$ sudo gem update cocoapods --pre # 更新 CocoaPods 至預覽版(以管理員權限)
$ sudo gem uninstall cocoapods -v 0.39.0 # 移除 CocoaPods 指定版本(以管理員權限)
pod
$ pod setup # CocoaPods 將信息下載到~/.cocoapods/repos 目錄下。如果安裝 CocoaPods 時不執行此命令,在初次執行 pod intall 命令時,系統也會自動執行該指令
$ pod --version # 檢查 CocoaPods 是否安裝成功及其版本號
$ pod install # 安裝 CocoaPods 的配置文件 Podfile
如遇到問題,不要慌,網上搜索一下基本上都能搜索到。如還是搜索不到,可以嘗試卸載重裝,重新來過。
三、使用Bundler管理
使用rvm方案比較直觀,主體思路就是使用方便我們切換Cocoapods版本的工具,着手點主要在“切換”上。下面要講到的Bundler方案,着手點主要在“配置”上。
1、Bundler簡介
大家知道Cocoapods的核心是一個叫做Podfile的文件,通過在Podfile上寫入項目所需pod的配置,我們可以通過簡單的pod install pod update命令來集成項目所需的pod。Cocoapods的這個思路其實是借鑒了一個叫做Bundler的工具。
Bundler 是一個 Ruby 項目的管理工具,可以理解成為 Ruby 界的 "CocoaPods"。准確來說,CocoaPods 是借鑒了 Bundler 的思想和模式。由於 CocoaPods 本身也是一個 Ruby 項目,因此我們可以通過 Bundler 來管理我們要使用的 CocoaPods 版本。
2、具體步驟
1)安裝Bundler
Bundler本身就是一個gem,打開 terminal 輸入下面的命令。
gem install bundler
2)創建 Gemfile
文件
類似Cocoapods的Podfile文件,我們需要創建一個Gemfile文件,文件位置和Podifle所在位置相同即可。可以看到它跟 Podfile 的初始化指令 pod init 非常類似,Gemfile 和 Podfile 這兩個文件名也非常類似。
bundle init
3)配置 Gemfile 內容
假如我們需要使用 1.7.4 的 CocoaPods,可以將 Gemfile 的內容設置為以下內容。可以看到它跟 Podfile 的配置風格 pod 'AFNetworking', '~>3.0' 非常類似。
source "https://gems.ruby-china.com"
gem 'cocoapods','1.7.4'
4)安裝特定版本的 CocoaPods
執行安裝指令,類似指令 pod install
bundle install
這里 bundle install
后可能很長時間沒有反應,是因為source 源地址可能為https://rubygems.org
,但由於被牆了,建議使用國內地址 https://gems.ruby-china.com
。或者使用指令全局鏡像替換 bundle config 'mirror.https://rubygems.org' 'https://gems.ruby-china.com'
,因為一些外網的 Gemfile 是無法更改的。
5)使用安裝的CocoaPods
使用 Bundler 控制上一步安裝的 CocoaPods 來安裝我們所需的 Pods。除了有 bundle exec 這個前綴,其他和我們平時使用 pod 命令一樣。若去掉 bundle exec 這個前綴,運行的就是默認版本的 Cocoapods 了
bundle exec pod install
6)效果展示

我們可以看到不同的路徑下 pod --version
出的版本是不一樣的
2、Podfile.lock文件推薦加入到版本控制中,這樣可以保證項目中的成員使用相同版本的pod。
3、pod update,會忽略Podfile.lock中的版本,直接查詢最新的pod版本,並安裝pod。可以使用pod outdated查詢可以升級的pod。
4、即使在Podfile文件中指定了明確的版本,輕易使用pod update也會增加項目成員間pod不同的風險,因為A可能依賴於B,如果使用成員1 pod install時,B版本為1.0,當成員2pod install時,B版本可能是2.0,在這種情況下就需要要Podfile.lock來保證項目成員間pod版本的一致了。
鏈接:https://www.jianshu.com/p/a50c12c834d2
參考鏈接:
如何讓 Cocoapods 不同版本共存
iOS開發中如何管理多個版本的Cocoapods、gem
多個版本的 CocoaPods 的切換