3

使用导轨:

如果 Bundler 检索到正确的 gem(和依赖项)并将它们锁定在给定项目的 Gemfile.lock 中,那么在同一个项目中使用 gemset 不是矫枉过正吗?有人告诉我,使用 gemsets 仍然是一种很好的做法,因为在当前 PATH 中仅具有相同 gem 的 2 个版本可能会导致冲突。这是正确的,还是您只需要一个或另一个:Bundler 或 RVM?

4

2 回答 2

7

如果您使用捆绑器,则使用 RVM 的 gemset 是多余的。

使用 Bundler 时的冲突主要有两个原因:

  1. 使用需要其他 gem 而没有精确版本规范的 gem。
  2. rails g migration可执行冲突:您同时安装了 rails v3 和 v4,那么调用或调用时我们该去哪里rake

如果您谨慎地在 Gemfile 中更明确地指定 gem 版本,则可以解决第一个问题。

在使用 Gemfile 的项目中工作时,可以通过在可执行调用前加上前缀来解决第二个问题bundle exec,这将在当前包的上下文中运行命令(例如bundle exec rake db:migrate)。

当您想在 Gemfile 的上下文(例如rails new fancy_app)之外指定 gem 版本时,您可以指定任何 gem 的版本,方法是提供它作为由下划线包围的第一个参数。

rake --version
rake _10.3.1_ --version
rails new rails_latest_app
rails _3.2.12_ new rails_3_app
rails _4.0.4_ new rails_4_app

RubyGems 通过为任何 gem 的可执行文件创建版本感知包装器来为您处理所有这些。只需运行cat `which gem_executable`gem_executable类似于rake, rails, foreman,pry等)并看看。

Stephen Ball 有一篇关于如何使用 Bundler 而不是 RVM gemsets的好博文,其中更详细地探讨了重叠。

虽然 RVM 的 gemset 不是必需的,但 RVM 提供了其他便利:

  • 自动将 bundler binstubs 添加到 中PATH,因此您可以避免键入bundle exec. 注意bundler 插件oh-my-zsh提供了相同的功能
  • 管理多个 Ruby 版本

ruby 版本管理器rbenv也提供了类似的功能。

于 2014-03-19T22:43:22.327 回答
2

是的,宝石是矫枉过正的。只需使用捆绑器。

RVM 对于管理 Ruby 本身的版本仍然很有用 - 但不要将它用于 gemsets。只需使用 bundler 进行 gem 版本管理。

关于 gem 版本之间的冲突,如果您bundle exec在每个命令之前使用,您应该没有问题 - 例如。bundle exec rake db:migrate管他呢。

于 2014-03-19T22:03:47.507 回答