Ruby irb, bundle exec irb, bundle console, rails console 的区别

xiaoronglv · 2014年12月06日 · 最后由 jicheng1014 回复于 2014年12月07日 · 4566 次阅读

我们可以使用多种命令启动 Ruby console:

  1. irb
  2. bundle exec irb
  3. bundle console
  4. bundle exec rails console

他们之间有什么关系呢?

1 irb

使用 irb 时,它不关心你的 Gemfile 和 Gemfile.lock,它就是一个裸的 Ruby console,只加载 Ruby 的核心库。

  1. 你如果要使用 RestClient,手工 require 'rest_client'
  2. 你如果要使用 MySQL,手工 require 'mysql2'
  3. 如果你要是用 Rack,手工 require 'rack'

并且当你在 irb 中 require 'rack' 时,它默认使用最高版本的 rack。


/Users/xiaoronglv [13:05]
> gem list rack

*** LOCAL GEMS ***

rack (1.5.2, 1.5.1)
rack-test (0.6.2)

/Users/xiaoronglv [13:05]
> irb
2.1.5 :001 > require 'rack'
 => true 
2.1.5 :002 > Gem.loaded_specs["rack"].version.to_s
 => "1.5.2" 

总结

  1. irb 不会考虑 Gemfile 和 Gemfile.lock;
  2. require 默认使用最新的版本的 Gem。

备注:

Ruby 1.9.* 以上的版本默认集成了 rubygem.

require 最新版本的 gem 不是 Ruby 本来的的行为,是 rubygems 通过 monkey patch 重写了 kernal#require 方法。查看源码

2 bundle exec irb


> gem list rack

*** LOCAL GEMS ***

rack (1.5.2, 1.5.1)
rack-test (0.6.2)


# /tmp/christ/Gemfile
source 'http://ruby.taobao.org'
gem 'rack'


# /tmp/christ/Gemfile.lock
GEM
  remote: http://ruby.taobao.org/
  specs:
    rack (1.5.1)

PLATFORMS
  ruby

DEPENDENCIES
  rack

使用 bundle exec irb 时,bundler 会把当前文件夹下 Gemfile 和 Gemfile.lock 指定版本的 gems 列表添加到 $LOAD_PATH 中。

/tmp/christ [12:34]
> bundle exec irb
2.1.5 :001 > puts $LOAD_PATH
/Users/xiaoronglv/.rvm/gems/ruby-2.1.5/gems/rack-1.5.1/lib
...

当我 require 'rack' 时,会使用指定版本的 rack。

2.1.5 :001 > require 'rack'
 => true 
2.1.5 :002 > Gem.loaded_specs["rack"].version.to_s
 => "1.5.1" 

总结:

  1. bundle exec irb 会把 Gemfile 和 Gemfile.lock,指定的版本的 gems 添加到 $LOAD_PATH。(Bundler.setup)

  2. require gem 时,使用 Gemfile.lock 的版本号。

3 bundle console

bundle console 比 bundle exec irb 多做了一些工作。

  1. 把 Gemfle 和 Gemfile.lock 指定版本呢的 gems 添加到了 $LOAD_PATH。(Bundler.setup)

    > bundle console   
    2.1.5 :001 > puts $LOAD_PATH
    /Users/xiaoronglv/.rvm/gems/ruby-2.1.5/gems/rack-1.5.1/lib
    ...
    
  2. require 所有的 gems。(Bundler.require)

    2.1.5 :002 > puts $LOADED_FEATURES
    ....
    /Users/xiaoronglv/.rvm/gems/ruby-2.1.5/gems/rack-1.5.1/lib/rack.rb
    ... 
    

4 bundle exec rails console

bundle exec rails console 做的工作更多

  1. require Gemfile 的 gem,并且严格遵守其版本号。
  2. require 整个 rails 环境
  3. setup autoloading
  4. initialize app

这个命令我们平时用的最多。

5 总结

为了便于比较,我做了一个表格。

备注:此处的 gems 代指 Gemfile 和 Gemfile.lock 指定版本号的所有 gems。

还真是没有注意过这些,基本上使用最多的是 irb(pry) 和 rails console,做 sinatra 开发的话应该会用到中间两个

感谢翻译分享,原文我也看过,惭愧没想到翻译过来分享一下

原来 Bundler 的原理就是修改 $LOAD_PATH ? 另外提供一个启动 irb 的小技巧,使用 irb -r irb/completion 启动 irb 可以像 rails console 一样可以使用 Tab 键补全,不知道大家是不是都这么用。

#4 楼 @yuhaidonghd

Bundler.setup 是修改 load path Bundler.require 是 require gemfile 中的 gems

好像在 ruby weekly 看过这篇文章的链接 感谢楼主

需要 登录 后方可回复, 如果你还没有账号请 注册新账号