使用导轨:
如果 Bundler 检索到正确的 gem(和依赖项)并将它们锁定在给定项目的 Gemfile.lock 中,那么在同一个项目中使用 gemset 不是矫枉过正吗?有人告诉我,使用 gemsets 仍然是一种很好的做法,因为在当前 PATH 中仅具有相同 gem 的 2 个版本可能会导致冲突。这是正确的,还是您只需要一个或另一个:Bundler 或 RVM?
如果 Bundler 检索到正确的 gem(和依赖项)并将它们锁定在给定项目的 Gemfile.lock 中,那么在同一个项目中使用 gemset 不是矫枉过正吗?有人告诉我,使用 gemsets 仍然是一种很好的做法,因为在当前 PATH 中仅具有相同 gem 的 2 个版本可能会导致冲突。这是正确的,还是您只需要一个或另一个:Bundler 或 RVM?
如果您使用捆绑器,则使用 RVM 的 gemset 是多余的。
使用 Bundler 时的冲突主要有两个原因:
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 提供了其他便利:
PATH
,因此您可以避免键入bundle exec
. 注意bundler 插件oh-my-zsh
提供了相同的功能ruby 版本管理器rbenv
也提供了类似的功能。
是的,宝石是矫枉过正的。只需使用捆绑器。
RVM 对于管理 Ruby 本身的版本仍然很有用 - 但不要将它用于 gemsets。只需使用 bundler 进行 gem 版本管理。
关于 gem 版本之间的冲突,如果您bundle exec
在每个命令之前使用,您应该没有问题 - 例如。bundle exec rake db:migrate
管他呢。