iOS开发中如何管理多个版本的Cocoapods、gem

来源:互联网 发布:ucosiii软件定时器 编辑:程序博客网 时间:2024/05/02 01:57

需求场景

之前在集成集团的各种pod库时,发现如果不使用0.35.0版本的Cocoapods,就无法成功集成,所以无奈将自己机器上刚安装的最新版Cocoapods降级。可是好景不长,过了些许日子后,发现在学习swift的过程中,0.35.0的Cocoapods是不支持集成有swift的pod的。一会儿升级到最新的Cocoapods,一会儿降级到0.35.0,既耗时又容易出错,更谈不上优雅了。
具体多繁琐呢?你需要用

gem list --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)

然后,你需要一个个的卸载一遍

gem uninstall cocoapodsgem uninstall cocoapods-coregem uninstall cocoapods-downloadergem uninstall cocoapods-pluginsgem uninstall cocoapods-searchgem uninstall cocoapods-statsgem uninstall cocoapods-trunkgem uninstall cocoapods-try

然后再重新安装一遍你需要的特定版本Cocoapods

gem install cocoapods -v 0.35.0


思路

我们现在需要的是实现在公司项目中使用特定版本(0.35.0)的Cocoapods,而在自学Swift用到的项目中使用其他版本(一般为最新)的Cocoapods。此外,如果能够支持不止两个版本,甚至于每个项目都可以有自己需要的特定版本Cocoapods是最好不过的了。

废话不多说,在实践中,我发现了两种方案:

  • 随时随地切换不同版本的Cocoapods

  • 每个项目通过配置,安装作用域仅限该项目的Cocoapods


第一种方案(随时随地切换所需Cocoapods)

由于Cocoapods是一个ruby的gem,所以“随时随地切换不同版本的Cocoapods”也就是“随时随地切换不同版本的gem”的另一种说法,而实现“随时随地切换不同版本的gem”的最简单方法,就是找个能实现“随时随地切换不同版本ruby”的工具。

巧的是,这种工具真的存在,还不止一个,哈哈哈哈哈哈哈哈……

这类工具有rvm、rbenv、ruby-build、chruby、ruby-install等,而笔者使用的是rvm,其他工具我也没尝试过,欢迎大家前去尝试。下面也就根据rvm的实际使用展开:

  1. 如果没有安装rvm,打开终端,安装rvm

  2. 安装rvm成功后,安装多个版本的ruby,你需要几个版本的Cocoapods,就安装几个版本的ruby(数量不要太多,原因后面会讲到)

  3. 不同版本的ruby下安装不同版本的Cocoapods

  4. 想用哪个版本的Cocoapods,就切换到相应的ruby版本就行了(rvm use命令)

  5. (可选步骤)用rvm给用到的ruby加上别名(rvm alias系列命令)

是不是有点儿傻?是的,这是最笨的方法。其实使用rvm还可以用到gemset,这样的话,就可以只安装一个ruby版本,但是拥有多个gem集了。步骤也很简单:

  1. 使用下面这行命令同时创建三个gemset

    rvm gemset create Gemset0 Gemset1 Gemset2
  2. 使用rvm gemset use Gemset1命令来使用“Gemset1”这个gem集

  3. 使用gem install命令安装你需要的特定版本Cocoapods(以及其他gem)

  4. 注意:rvm安装的每个ruby里,都是有两个叫做default、global的gemset的,一个默认gemset,一个全局gemset


第二种方案(每个项目都有自己的Cocoapods)

第一种方案比较直观,主体思路就是使用方便我们切换Cocoapods版本的工具,着手点主要在“切换”上。下面要讲到的第二种方案,着手点主要在“配置”上。

大家知道Cocoapods的核心是一个叫做Podfile的文件,通过在Podfile上写入项目所需pod的配置,我们可以通过简单的pod installpod update命令来集成项目所需的pod。Cocoapods的这个思路其实是借鉴了一个叫做Bundler的工具,而Bundler就是实现第二种方案的关键。具体步骤如下:

  1. 安装Bundler:Bundler本身就是一个gem,通过gem install bundler命令即可安装

  2. 类似Cocoapods的Podfile文件,我们需要创建一个Gemfile文件,文件位置和Podifle所在位置相同即可。(通过在项目主目录下执行bundle init命令也可)

  3. 在Gemfile文件中,我们想配置所需pod一样配置我们所需的gem:

    source "https://rubygems.org"gem 'cocoapods', '0.35.0'
  4. pod install一样的,执行bundle install

  5. 想要运行刚刚Bundler安装的cocoapods的话,在相应位置,执行bundle exec pod install即可(除了有bundle exec这个前缀,其他和你平时使用pod命令一样,当然,去掉bundle exec这个前缀,你运行的就是你之前全局安装的Cocoapods了)


利用oh-my-zsh弥补方案的不足

事实上,两个方案都是有不足的。比如第一个方案,我们需要记住自己当前使用的ruby版本是哪个版本(或者当前使用的是哪个gemset),偶尔忘记的时候,会让我们做不少无用功;而第二个方案,最明显的就是,需要每次都额外敲入bundle exec这两个单词。

  • 针对第一个方案:
    由于笔者同时使用了zsh和oh-my-zsh,直接在.zshrc文件配置一下风格就好了。
    我使用的是oh-my-zsh内置的amuse主题:

    ZSH_THEME="amuse"

    效果:
    _1
    可以看到,每次输入命令前,我们都可以知道当前使用的ruby版本,以及哪个gemset

  • 针对第二个方案:
    设置一下alias就好了,同样的,由于笔者使用了zsh和oh-my-zsh,直接在.zshrc里面配置命令的alias就好了
    我的alias配置如下:

    alias zshconfig="mate ~/.zshrc"alias ohmyzsh="mate ~/.oh-my-zsh"alias be="bundle exec"alias bp="bundle exec pod"

    之后,bundle exec pod install就可以写成be pod install,甚至是bp install

0 0
原创粉丝点击