为什么使用宝石集时需要“捆绑执行”



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 的位置。

相关内容

  • 没有找到相关文章

最新更新