为什么在使用gemsets时需要`bundle exec`?

时间:2016-07-07 14:10:20

标签: ruby rubygems rvm bundler gemset

rvm current说我已切换到某个特定的宝石集,gem list只列出一个rake宝石,那么为什么我需要预先添加bundle exec

$ rvm current
ruby-2.3.0@rm

$ gem list rake

*** LOCAL GEMS ***

rake (10.4.2)

$ rake
rake aborted!
Gem::LoadError: You have already activated rake 10.4.2, but your Gemfile requires rake 11.1.2. Prepending `bundle exec` to your command may solve this.
/home/rm/.rvm/gems/ruby-2.3.0@rm/gems/bundler-1.12.5/lib/bundler/runtime.rb:35:in `block in setup'
/home/rm/.rvm/gems/ruby-2.3.0@rm/gems/bundler-1.12.5/lib/bundler/runtime.rb:20:in `map'
/home/rm/.rvm/gems/ruby-2.3.0@rm/gems/bundler-1.12.5/lib/bundler/runtime.rb:20:in `setup'
/home/rm/.rvm/gems/ruby-2.3.0@rm/gems/bundler-1.12.5/lib/bundler.rb:95:in `setup'
/home/rm/.rvm/gems/ruby-2.3.0@rm/gems/bundler-1.12.5/lib/bundler/setup.rb:9:in `<top (required)>'
/home/rm/app/releases/20160707125838/config/boot.rb:3:in `<top (required)>'
/home/rm/app/releases/20160707125838/config/application.rb:1:in `<top (required)>'
/home/rm/app/releases/20160707125838/Rakefile:4:in `<top (required)>'
LoadError: cannot load such file -- bundler/setup
/home/rm/app/releases/20160707125838/config/boot.rb:3:in `<top (required)>'
/home/rm/app/releases/20160707125838/config/application.rb:1:in `<top (required)>'
/home/rm/app/releases/20160707125838/Rakefile:4:in `<top (required)>'
(See full trace by running task with --trace)

UPD 让我让自己更清楚。 rm gemset处于活动状态,我在那里只看到一个rake gem(10.4.2)。但rake-11.1.2bundler一起安装。当我运行bundle exec rake时,会调用rake-11.1.2。那么为什么我不会在gem报告的宝石列表中看到它? Aren宝石应该将宝石彼此隔离开来。

哦,忘了提到它是一台生产机器。

3 个答案:

答案 0 :(得分:1)

正如你在错误中看到的那样,你的rake调用需要使用rake 11.1.2,但你的本地机器默认是rake 10.4.2所以如果没有使用bundle exec预先调用调用,则使用默认值(10.4.2)。 exec执行的bundle总是使用项目gemfile中指定的gem版本,因此最好使用bundle exec

答案 1 :(得分:0)

也许你没有正确设置gemset。如果单个gemset具有同一gem的多个版本,则应使用bundle exec。尝试为您的项目创建和使用特定的宝石集,如果您没有明确说明,则rvm使用默认宝石过度拥挤的宝石

答案 2 :(得分:0)

在开发机器上bundler安装gem所在的宝石。你可以在gem list的输出中看到它们。但是在生产服务器上,它们通常安装在单独的目录中。这就是--deployment选项特别有用的。或者您可以使用--path选项更改gem的位置。