使用rvm时,有什么办法绕过重新下载安装的宝石?

时间:2010-12-08 23:08:30

标签: ruby-on-rails ruby rvm

我正在使用不同宝石的rvm并喜欢它。我遇到的唯一问题是,当我创建新的宝石并选择我想要的宝石时,似乎需要一段时间才能重新下载宝石。有没有办法让rvm知道使用已安装在另一个gemset中的gem?

例如,假设我有一个名为set1的gemset,并安装了wirble gem。现在我创建一个名为set2的新rvm。如果我在set2上“gem install wirble”,它似乎会再次下载wirble。有什么办法让rvm使用已经在set1中的版本?

编辑1:感谢大家或回复到目前为止。只是为了更清楚地解释一下,我觉得很奇怪的是当我想安装wirble并且我的计算机上已经存在SAME EXACT版本时,为什么“gem install wrible”需要上网并再次下载同样的东西?为什么不在本地安装我的计算机(即在另一个拥有我需要的确切文件的gemset中)

编辑2:我正在使用同一版本的ruby。所以我的例子是假设我使用的是ruby 1.9.2。我只改变了宝石。我不明白为什么做一个“宝石安装wirble”需要再次下载它只是为了一个不同的宝石集(再次,在相同的红宝石1.9.2)

5 个答案:

答案 0 :(得分:1)

另一个选择是使用Bundler而不是RVM gem集。如果它们已经在您的系统上,则不会下载宝石,并且允许您为每个应用程序设置一个唯一的宝石。

答案 1 :(得分:0)

这是设计的。将它们分开是重点。 (因此,使用一组不影响另一组等)。

也许你不需要时使用多个gemsets?例如,不要为每个rails应用程序使用单独的gemset,只需使用一个。例如,我使用ruby-1.9.2-p0@rails3进行所有rails 3开发。

或者我想你总是可以手动将它们从一个rvm目录复制到另一个rvm目录(我系统上的~/.rvm/gems/ruby-1.9.2-p0@rails3/gems/)。当然,这只适用于针对相同ruby版本编译的gem。

答案 2 :(得分:0)

如果您担心堵塞一系列电子管,您可能想看看是否可以使用gem server在您自己的机器上设置gem服务器并告诉rvm使用它。

答案 3 :(得分:0)

谷歌搜索“从本地缓存安装宝石”出现了这个:

http://akitaonrails.com/2011/05/29/rubygems-local-cache-hack

它基本上是一个使用公共gem服务器作为上游的缓存gem代理。

轻量级解决方案:

这个允许您有选择地安装宝石(包括他们的deps):

  1. 切换到已安装所需gem的gemset。
  2. 运行“gem env”以获取特定于gemset的GEM_PATH。
  3. cd到该gem路径,然后是缓存文件夹。以下是所有.gem文件。
  4. 不离开该文件夹,切换到所需宝石所​​在的宝石集。
  5. 照常运行gem install,但传递--local选项。应自动从当前文件夹中提取所需的gem及其deps。
  6. 如果您确实要复制gemset,请在gem路径缓存中运行这些步骤。实际上这不是必需的,因为除非必要,否则“rvm gemset copy”不会下载。

    1. 确保您已切换到源gemset(您将从中复制)。
    2. 运行“rvm gemset export”
    3. 编辑default.gems文件并删除注释行。
    4. 切换到目标gemset(您要复制到的目的地)。
    5. RUN:gem install --local`cat default.gems`
    6. 可选:删除default.gems文件。

答案 4 :(得分:0)

似乎没有提及的一个RVM功能是copy。这在以下情况下特别有用:

  • 您想制作一个新宝石 B ,其中包含宝石中已有的大部分宝石 A

  • 也许你想要特别隔离一个宝石并比较两个版本。或者别的什么。

您可以在适当的ruby版本上下文中执行以下操作:

rvm gemset copy 1.9.4-p448@old_gemset_name 1.9.3-p448@new_gemset_name

此命令将生成一个新的gemset,它是旧的gemite的精确克隆,然后您可以删除并重新安装有问题的gem。我用Rspec做了这个,删除了2.14.1以与3.0.0beta进行比较,如下所示:

gem uninstall rspec -v2.14
gem install rspec -v3.0.0.beta1

还有一些其他的卸载,但你明白了。结果是我可以运行两个单独的测试套件,每个测试套件在各自的目录中并使用不同的Rspec,只需切换gemsets即可。 < 3 RVM。

编辑:从here获得了这个想法。