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
宝石组处于活动状态,我在那里只看到一颗rake
宝石 ( 10.4.2
)。但是rake-11.1.2
安装了bundler
.当我运行bundle exec rake
时,rake-11.1.2
被调用。那么为什么我在gem
报告的宝石列表中看不到它呢?宝石组不是应该将成组宝石彼此隔离吗?
哦,忘了说这是一台生产机器。
正如您在错误中看到的那样,您的 rake 调用需要使用 rake 11.1.2,但您的本地机器默认值为 rake 10.4.2,因此,如果不在调用前面加上捆绑 exec,则使用默认值 (10.4.2)。bundle exec 所做的是始终使用项目 gemfile 中指定的 gem 版本,因此始终是使用捆绑 exec 的最佳实践
也许您没有正确设置宝石集。如果单个 gemset 具有同一 gem 的多个版本,则应使用捆绑 exec。尝试为您的项目创建和使用特定的 gem集,如果您没有明确说明,rvm 将使用默认的 gem
在开发计算机上,bundler
gem
安装宝石。你可以在gem list
的输出中看到它们。但是,在生产服务器上,它们通常安装到单独的目录中。这就是--deployment
选项特别做的事情。或者您可以使用--path
选项更改 gem 的位置。