iOS开发中如何管理多个版本的Cocoapods、gem - The Life with iOS
- 博客频道 - CSDN.NET
需求场景
之前在集成集团的各种pod库时,发现如果不使用0.35.0版本的Cocoapods,就无法成功集成,所以无奈将自己机器上刚安装的最新版Cocoapods降级。可是好景不长,过了些许日子后,发现在学习Swift的过程中,0.35.0的Cocoapods是不支持集成有swift的pod的。一会儿升级到最新的Cocoapods,一会儿降级到0.35.0,既耗时又容易出错,更谈不上优雅了。
具体多繁琐呢?你需要用
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
我们现在需要的是实现在公司项目中使用特定版本(0.35.0)的Cocoapods,而在自学Swift用到的项目中使用其他版本(一般为最新)的Cocoapods。此外,如果能够支持不止两个版本,甚至于每个项目都可以有自己需要的特定版本Cocoapods是最好不过的了。
废话不多说,在实践中,我发现了两种方案:
随时随地切换不同版本的Cocoapods
每个项目通过配置,安装作用域仅限该项目的Cocoapods
由于Cocoapods是一个ruby的gem,所以“随时随地切换不同版本的Cocoapods”也就是“随时随地切换不同版本的gem”的另一种说法,而实现“随时随地切换不同版本的gem”的最简单方法,就是找个能实现“随时随地切换不同版本ruby”的工具。
巧的是,这种工具真的存在,还不止一个,哈哈哈哈哈哈哈哈……
这类工具有rvm、rbenv、ruby-build、chruby、ruby-install等,而笔者使用的是rvm,其他工具我也没尝试过,欢迎大家前去尝试。下面也就根据rvm的实际使用展开:
如果没有安装rvm,打开终端,安装rvm
安装rvm成功后,安装多个版本的ruby,你需要几个版本的Cocoapods,就安装几个版本的ruby(数量不要太多,原因后面会讲到)
不同版本的ruby下安装不同版本的Cocoapods
想用哪个版本的Cocoapods,就切换到相应的ruby版本就行了(rvm use命令)
(可选步骤)用rvm给用到的ruby加上别名(rvm alias系列命令)
是不是有点儿傻?是的,这是最笨的方法。其实使用rvm还可以用到gemset,这样的话,就可以只安装一个ruby版本,但是拥有多个gem集了。步骤也很简单:
使用下面这行命令同时创建三个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就是实现第二种方案的关键。具体步骤如下:
安装Bundler:Bundler本身就是一个gem,通过gem install bundler命令即可安装
类似Cocoapods的Podfile文件,我们需要创建一个Gemfile文件,文件位置和Podifle所在位置相同即可。(通过在项目主目录下执行bundle init命令也可)
在Gemfile文件中,我们想配置所需pod一样配置我们所需的gem:
source"https://rubygems.org"gem'cocoapods','0.35.0'
和pod install一样的,执行bundle install
想要运行刚刚Bundler安装的cocoapods的话,在相应位置,执行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