iOS開發(fā)中如何管理多個版本的Cocoapods、gem - The Life with iOS
- 博客頻道 - CSDN.NET
需求場景
之前在集成集團的各種pod庫時,發(fā)現(xiàn)如果不使用0.35.0版本的Cocoapods,就無法成功集成,所以無奈將自己機器上剛安裝的最新版Cocoapods降級??墒呛镁安婚L,過了些許日子后,發(fā)現(xiàn)在學習Swift的過程中,0.35.0的Cocoapods是不支持集成有swift的pod的。一會兒升級到最新的Cocoapods,一會兒降級到0.35.0,既耗時又容易出錯,更談不上優(yōu)雅了。
具體多繁瑣呢?你需要用
gemlist--local | grep cocoapods
列出目前gem中安裝的所有Cocoapods的組件
你可能會看到這樣的命令行輸出
cocoapods(0.39.0, 0.35.0)cocoapods-core(0.39.0, 0.35.0)cocoapods-downloader(0.9.3, 0.8.1)cocoapods-plugins(0.4.2, 0.3.2)cocoapods-search(0.1.0)cocoapods-stats(0.6.2)cocoapods-trunk(0.6.4, 0.4.1)cocoapods-try(0.5.1, 0.4.5)
然后,你需要一個個的卸載一遍
gemuninstallcocoapodsgemuninstallcocoapods-coregemuninstallcocoapods-downloadergemuninstallcocoapods-pluginsgemuninstallcocoapods-searchgemuninstallcocoapods-statsgemuninstallcocoapods-trunkgemuninstallcocoapods-try
然后再重新安裝一遍你需要的特定版本Cocoapods
geminstallcocoapods-v0.35.0
我們現(xiàn)在需要的是實現(xiàn)在公司項目中使用特定版本(0.35.0)的Cocoapods,而在自學Swift用到的項目中使用其他版本(一般為最新)的Cocoapods。此外,如果能夠支持不止兩個版本,甚至于每個項目都可以有自己需要的特定版本Cocoapods是最好不過的了。
廢話不多說,在實踐中,我發(fā)現(xiàn)了兩種方案:
隨時隨地切換不同版本的Cocoapods
每個項目通過配置,安裝作用域僅限該項目的Cocoapods
由于Cocoapods是一個ruby的gem,所以“隨時隨地切換不同版本的Cocoapods”也就是“隨時隨地切換不同版本的gem”的另一種說法,而實現(xiàn)“隨時隨地切換不同版本的gem”的最簡單方法,就是找個能實現(xiàn)“隨時隨地切換不同版本ruby”的工具。
巧的是,這種工具真的存在,還不止一個,哈哈哈哈哈哈哈哈……
這類工具有rvm、rbenv、ruby-build、chruby、ruby-install等,而筆者使用的是rvm,其他工具我也沒嘗試過,歡迎大家前去嘗試。下面也就根據(jù)rvm的實際使用展開:
如果沒有安裝rvm,打開終端,安裝rvm
安裝rvm成功后,安裝多個版本的ruby,你需要幾個版本的Cocoapods,就安裝幾個版本的ruby(數(shù)量不要太多,原因后面會講到)
不同版本的ruby下安裝不同版本的Cocoapods
想用哪個版本的Cocoapods,就切換到相應的ruby版本就行了(rvm use命令)
(可選步驟)用rvm給用到的ruby加上別名(rvm alias系列命令)
是不是有點兒傻?是的,這是最笨的方法。其實使用rvm還可以用到gemset,這樣的話,就可以只安裝一個ruby版本,但是擁有多個gem集了。步驟也很簡單:
使用下面這行命令同時創(chuàng)建三個gemset
rvm gemsetcreateGemset0 Gemset1 Gemset2
使用rvm gemset use Gemset1命令來使用“Gemset1”這個gem集
使用gem install命令安裝你需要的特定版本Cocoapods(以及其他gem)
注意:rvm安裝的每個ruby里,都是有兩個叫做default、global的gemset的,一個默認gemset,一個全局gemset
第一種方案比較直觀,主體思路就是使用方便我們切換Cocoapods版本的工具,著手點主要在“切換”上。下面要講到的第二種方案,著手點主要在“配置”上。
大家知道Cocoapods的核心是一個叫做Podfile的文件,通過在Podfile上寫入項目所需pod的配置,我們可以通過簡單的pod installpod update命令來集成項目所需的pod。Cocoapods的這個思路其實是借鑒了一個叫做Bundler的工具,而Bundler就是實現(xiàn)第二種方案的關鍵。具體步驟如下:
安裝Bundler:Bundler本身就是一個gem,通過gem install bundler命令即可安裝
類似Cocoapods的Podfile文件,我們需要創(chuàng)建一個Gemfile文件,文件位置和Podifle所在位置相同即可。(通過在項目主目錄下執(zhí)行bundle init命令也可)
在Gemfile文件中,我們想配置所需pod一樣配置我們所需的gem:
source"https://rubygems.org"gem'cocoapods','0.35.0'
和pod install一樣的,執(zhí)行bundle install
想要運行剛剛Bundler安裝的cocoapods的話,在相應位置,執(zhí)行bundle exec pod install即可(除了有bundle exec這個前綴,其他和你平時使用pod命令一樣,當然,去掉bundle exec這個前綴,你運行的就是你之前全局安裝的Cocoapods了)
事實上,兩個方案都是有不足的。比如第一個方案,我們需要記住自己當前使用的ruby版本是哪個版本(或者當前使用的是哪個gemset),偶爾忘記的時候,會讓我們做不少無用功;而第二個方案,最明顯的就是,需要每次都額外敲入bundle exec這兩個單詞。
針對第一個方案:
由于筆者同時使用了zsh和oh-my-zsh,直接在.zshrc文件配置一下風格就好了。
我使用的是oh-my-zsh內置的amuse主題:
ZSH_THEME="amuse"
效果:

可以看到,每次輸入命令前,我們都可以知道當前使用的ruby版本,以及哪個gemset
針對第二個方案:
設置一下alias就好了,同樣的,由于筆者使用了zsh和oh-my-zsh,直接在.zshrc里面配置命令的alias就好了
我的alias配置如下:
aliaszshconfig="mate ~/.zshrc"aliasohmyzsh="mate ~/.oh-my-zsh"aliasbe="bundle exec"aliasbp="bundle exec pod"
之后,bundle exec pod install就可以寫成be pod install,甚至是bp install