【问题标题】:rvm gemsets with Bundler带有 Bundler 的 rvm gemsets
【发布时间】:2014-03-19 21:53:47
【问题描述】:

使用 Rails:

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

【问题讨论】:

    标签: ruby-on-rails rvm bundler rvmrc


    【解决方案1】:

    如果您使用的是 bundler,那么使用 RVM 的 gemsets 是多余的。

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

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

    如果您谨慎地在 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_executable 类似于rakerailsforemanpry 等)然后看看。

    Stephen Ball 有一篇关于 how to use Bundler instead of RVM gemsets 的精彩博文,其中更详细地探讨了重叠部分。

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

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

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

    【讨论】:

    • 哇,这是一个完美的答案。 “bundle exec”现在在教程中也更有意义了。谢谢!我会投票,但显然我没有足够的代表点哈哈
    【解决方案2】:

    是的,宝石是多余的。只需使用捆绑器。

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

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

    【讨论】:

    • 我会投赞成票,但显然我没有足够的代表点数,谢谢
    猜你喜欢
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多