使用Bundler的rvm gemsets

时间:2014-03-19 21:53:48

标签: ruby-on-rails rvm bundler rvmrc

使用Rails:

如果Bundler检索到正确的gems(和依赖项)并将它们锁定在给定项目的Gemfile.lock中,那么对于同一个项目是否过度使用gemset是不是?我被告知使用gemsets仍然是一个很好的做法,因为在你当前的PATH中只有2个版本的同一个gem会导致冲突。这是正确的,还是只需要一个或另一个:Bundler或RVM?

2 个答案:

答案 0 :(得分:7)

如果你正在使用捆绑包,那么使用RVM的gemsets是多余的。

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

  1. 使用需要其他宝石但没有精确版本规格的宝石。
  2. 可执行冲突:您同时安装了rails v3和v4,那么在致电rails g migration或致电rake时我们会去哪里?
  3. 如果您在Gemfile中更明确地指定gem版本,则可以解决第一个问题。

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

    如果要在Gemfile的上下文之外指定gem版本(例如rails new fancy_app),可以通过将其作为由下划线包围的第一个参数来指定任何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_executablerakerailsforemanpry等等,然后看看。< / p>

    Stephen Ball有一篇关于how to use Bundler instead of RVM gemsets的好文章,其中详细介绍了重叠。

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

    • 自动将bundler binstub添加到PATH,这样您就可以避免输入bundle exec。请注意,bundler plugin for oh-my-zsh提供了相同的功能
    • 管理多个Ruby版本

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

答案 1 :(得分:2)

是的,宝石有点矫枉过正。只需使用bundler。

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

关于gem版本之间的冲突,如果您在每个命令之前使用bundle exec,则不应该出现问题 - 例如。 bundle exec rake db:migrate或其他什么。