Gem介绍
Gem是一个ruby库和程序的标准包,它通过RubyGem来定位、安装、升级和卸载,非常的便捷。
Ruby 1.9.2版本默认安装RubyGem,如果你使用其它版本,请参考如何安装RubyGem。
升级RubyGem
- <span style="font-family: 'comic sans ms', sans-serif;">$ gem update --system</span>
安装新的Gem
- <span style="font-family: 'comic sans ms', sans-serif;">$ gem install rai</span>
指定安装某一版本的Gem包
- <span style="font-family: 'comic sans ms', sans-serif;">$ gem install [gemname] --version=1.3.2</span>
在安装过程中可以看到如下提示,说明它是从rubygems.org内去寻找并安装gem package的。
Fetching source index for http://rubygems.org/
gem 的安装方式
所有的Gem包,会被安装到 [Ruby root]/lib/ruby/gems/1.9.1/
这其中包括了Cache、doc、gems、specifications 4个目录,cache下放置下载的原生gem包,gems下则放置的是解压过的gem包。
当安装过程中遇到问题时,可以进入这些目录,把有问题的gem删掉,重新 gem install 即可。
更新所有的 gems
- <span style="font-family: 'comic sans ms', sans-serif;">$ gem update </span>
更新指定的 gem
- <span style="font-family: 'comic sans ms', sans-serif;">$ gem update [gemname]</span>
在升级gem时遇到一个问题,如何升级到一个指定版本,系统是不提供 update [gemname] --version的,但可以使用install
- <span style="font-family: 'comic sans ms', sans-serif;">gem install [gemname] --version=[ver]</span>
删除某gem的所有安装版本
- <span style="font-family: 'comic sans ms', sans-serif;">gem uninstall [gemname]</span>
删除某gem指定版本
但有时只是想删除一个旧版本的gem,则使用如下的命令:
- <span style="font-family: 'comic sans ms', sans-serif;">$ gem uninstall [gemname] --version</span>
- <span style="font-family: 'comic sans ms', sans-serif;">$ sudo gem uninstall thor --version=0.14.2</span>
清除已经升级后所留的旧版gems
删除所有的gems
查看本机所安装过的gems
会显示出本机所有安装过的gem包和其所有版本号
- <span style="font-family: 'comic sans ms', sans-serif;">$ gem list --local</span>
查看本机是否装了某个gem?
- <span style="font-family: 'comic sans ms', sans-serif;">$ gem list --local | grep [gemname]</span>
Bundle 使用
Rails 3 中引入Bundle来管理项目中所有gem依赖,该命令只能在一个含有Gemfile的目录下执行,如rails 3项目的根目录
关于Gemfile 和 Gemfile.lock
所有project的信赖包都在Gemfile中进行配置,不再像以往那样,通过require来查找。Rails 3中如果需要 require 某个 gem 必须通过 Gemfile 来管理。
Gemfile.lock 则用来记录本机目前所有依赖的 RubyGems 和其版本,所以强烈建议将该文件放入版本控制器,从而保证大家基于同一环境下工作。
显示所有的依赖包
显示某个Gem包的安装位置
- <span style="font-family: 'comic sans ms', sans-serif;">$ bundle show [gemname]</span>
可以檢查目前缺少哪些 rubygem
- <span style="font-family: 'comic sans ms', sans-serif;">$ bundle check </span>
不缺的话则会输出:The Gemfile's dependencies are satisfied
如何安装所缺少的RubyGem呢?
- <span style="font-family: 'comic sans ms', sans-serif;">$ bundle install</span>
- <span style="font-family: 'comic sans ms', sans-serif;">$ bundle install [gemname]</span>
如果gems有新版本,Gemfile.lock如何同步更新
- <span style="font-family: 'comic sans ms', sans-serif;">$ bundle update</span>
- <span style="font-family: 'comic sans ms', sans-serif;">$ bundle update [gemname]</span>
这样bundle会去检查 http://rubygems.org/ 上 gem的最新版本,如果本地旧的话,会去更新到最近版本。然后同步更新Gemfile.lock
在Linux下不要使用 sudo bundle install/update,这样会在.bundle目录下查找bundle install path 的配置,找到后安装到该目录,而非系统指定的目录,不方便管理。
如何向项目中添加新的Gem引用?
Add the gem to Gemfile. just like below:
- gem 'rails', '3.0.1'
- gem 'sqlite3-ruby', :require => 'sqlite3'
- gem "haml"
- gem 'declarative_authorization'
- gem 'uuidtools'
锁定当前环境
使用bundle lock来锁定当前开发环境,这样,便不能通过bundle update来更改本地包的版本,使开发保持在一个稳定的环境中
通过unlock来解除锁定:
打包当装环境
bundle package 会把当前所有信赖的包都放到 ./vendor/cache/ 目录下,发布时可用来保证包版本的一致性。
Bundle支持Git安装
使用bundle install 更新
Gem & Plugin的选择
在Rails 2中,开发人员会更便向使用plugin,因为安装、更新的布署都会经常遇到问题,但在 Rails3 中引入了bundle之后,更多的人喜欢使用gem的方式来管理引用。
这样你的本地代码库会很干净,便于理解。也不需要将这些库放到版本控制器中,减少空间 ;)
Gem Bundle 入门