【问题标题】:How to install gem across all gemsets when using RVM使用 RVM 时如何在所有 gemset 中安装 gem
【发布时间】:2012-01-03 03:29:32
【问题描述】:

在使用 RVM 时,有没有办法在系统中的所有 rubies 和 gemsets(不仅仅是默认或系统 ruby​​)上安装 gem?

【问题讨论】:

    标签: ruby rvm


    【解决方案1】:

    你可以执行:

    rvm @global do gem install [gem_name]
    

    全局安装 gem(每个 ruby​​ 版本)。

    不可能为每个 ruby​​ 版本全局安装 gem。

    根据https://rvm.io/gemsets/initial,您可以在文件~/.rvm/gemsets/global.gems 中为每个ruby 版本定义自动安装的gem。在此文件中,您需要定义所需的 gem(每行一个),例如

    bundler
    zeus
    

    每次您将新的 ruby​​ 版本添加到 RVM 时,都会安装这些 gem。

    【讨论】:

      【解决方案2】:

      您可以安装到每个 ruby​​ 解释器的默认全局 gemset,如下所述:

      https://rvm.io/gemsets/global/

      而且这个页面还提到了默认的宝石集

      https://rvm.io/gemsets/using/

      为所有 ruby​​ 解释器安装 gem 也没有用 由于红宝石之间的不兼容。

      【讨论】:

        【解决方案3】:

        查看 RVM 文档,我没有看到具体的方法。但是,您可以通过 @global gemsets 和 gemset copying 的组合来近似它。

        全局宝石集提供可用于给定红宝石的所有宝石集的宝石。例如:

        rvm install 1.9.3
        rvm --create 1.9.3@rails3.0
        rvm --create 1.9.3@rails3.1
        rvm use 1.9.3@global
        gem install sqlite3
        

        将为 1.9.3 ruby​​ 创建两个不同的 gemset,并且全局 sqlite3 将在两者中可用。

        然后,一旦您完成此操作,您就可以将全局 gemset 复制到其他 rubies 上,他们自己就可以使用它。例如,作为上述的延续:

        rvm install 1.8.7
        rvm gemset copy 1.9.3@global 1.8.7@global
        

        现在 sqlite3 gem 可用于所有 1.8.7 gemset(假设我的参数顺序正确 - 我可能不会,在这种情况下切换 1.9.3 和 1.8.7)。这不是很理想,因为对一个红宝石的更新不会自动在其他红宝石中可见,您必须单独复制到每个红宝石,我想您最终可能会破坏您拥有的任何依赖红宝石的全局宝石设置在每个。不过,如果最后一点不是您预见到的问题,您可能可以编写一个脚本来避免前两点暗示的乏味。

        免责声明:这是严格阅读 RVM 文档后整理出来的,我实际上并没有尝试过。如果我有什么问题,我会很高兴编辑答案以修复它。

        【讨论】:

          【解决方案4】:

          TL;DR

          以前的答案已经过时了。我不确定何时引入此功能,但它肯定在 RVM 1.29.11 下可用(我在 1.29.12-next 下测试过,这是当前的 RVM 头),而且可能更早。如果您需要确切了解该功能的引入时间,可以查看RVM source code。

          您可以将一个或多个 gem 安装到每个 Ruby 的所有 @global gemset,或者显式安装到给定 Ruby 的所有 gemset,甚至所有 Ruby。这在 RVM 文档的 Set Actions -> Do -> Usage & Selectors 部分中有记录(可能有点不透明)。

          调用

          作为一个实际示例,要将新的(ish)rbs 和 typeprof gem 添加到所有兼容红宝石的全局 gemset 中,只需键入:

          rvm all do rvm @global do gem install rbs typeprof
          

          这通常是正确的做法,因为它会将您指定的 gem 安装到每个 Ruby 的全局 gemset 中,它可用于该 Ruby 的 所有 的 gemset,而不是安装多个副本到每个 Ruby 的每个单独的 gemset。如果您真的想在所有 gemsets 中而不是在 @global(包括 @default)中这样做,那么您当然可以。例如:

          rvm all-gemsets do gem install rbs typeprof
          

          我个人不推荐后一种方法,因为如果您添加具有大量依赖项的 gem,它会使删除变得更加困难,但您可以选择。

          不相容红宝石的注意事项

          JRuby 目前是这些特定 gem 的不兼容 Ruby 示例,可能会引发警告或错误。有时它会提供一个示例,说明如何为该特定 Ruby 版本安装 gem。如果是这样,您可以尝试一下。例如,JRuby 会抱怨:

          ERROR:  Error installing rbs:
                  The last version of rbs (>= 0) to support your Ruby & RubyGems was 1.0.0.
                  Try installing it with `gem install rbs -v 1.0.0`
                  rbs requires Ruby version >= 2.6. The current ruby version is 2.5.0.
          
          ERROR:  Error installing typeprof:
                  There are no versions of rbs (>= 1.3.1) compatible with your Ruby & RubyGems. Maybe try installing an older version of the gem you're looking for?
                  rbs requires Ruby version >= 2.6. The current ruby version is 2.5.0.
          

          在这种情况下,您可以安装早期版本的 RBS,但仍然无法安装 typeprof。因为 JRuby 经常在 MRI 之后运行(在撰写本文时,JRuby 目前针对 Ruby 2.5.7),因此您使用特定 gem 的里程会有所不同。这也适用于其他红宝石,因此请谨慎购买。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-06-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-23
            • 1970-01-01
            • 1970-01-01
            • 2014-07-12
            相关资源
            最近更新 更多