【问题标题】:Updating Ruby gems after updating Ruby 1.8.3 to 2.0.0将 Ruby 1.8.3 更新到 2.0.0 后更新 Ruby gem
【发布时间】:2014-07-10 03:31:52
【问题描述】:

我最近使用 RVM 将 Ruby 从 1.8.3 更新到 2.0.0。更新成功,我可以在命令行运行2.0.0就好了。

问题是,我在一个使用 Compass/Sass gem 的项目上工作,当我尝试从 shell 运行 compass watch 命令时,我得到了这个错误:

/Library/Ruby/Site/1.8/rubygems/dependency.rb:298:in `to_specs': Could not find 'compass' (>= 0) among 7 total gem(s) (Gem::LoadError)
from /Library/Ruby/Site/1.8/rubygems/dependency.rb:309:in `to_spec'
from /Library/Ruby/Site/1.8/rubygems/core_ext/kernel_gem.rb:53:in `gem'
from /usr/bin/compass:22

我的原始版本的 Ruby 存储了我在这里安装的所有 gem:

/Library/Ruby/Gems

但是 RVM 更新到 2.0.0 将 gem 列为保留在这里:

/Users/Jim/.rvm/gems/ruby-2.0.0-p481@global/gems

如何让 RVM 更新原始 gem,以便我可以在当前版本的 Ruby 中使用它们?这是否需要我在依赖于指南针的项目上重新安装 gem?

我在 rvm.io 上阅读了很多文档,并认为“rvm gemset update”会起作用。我还尝试了“rvm do gemset update”和“rvm all do gemset update”,但它没有找到旧的 gem。

有没有人知道我如何将 RVM 指向我的旧 gem 并让它将它们更新为 2.0.0 可以使用的 gemset?

【问题讨论】:

    标签: ruby rvm compass-sass


    【解决方案1】:

    试试这个:

    /usr/bin/gem list --no-version > ~/Desktop/old_gems
    xargs gem install < ~/Desktop/old_gems
    

    第一个命令将告诉旧的gem 列出与旧 Ruby 相关的 gem,不包括它们的版本号,它将作为“old_gems”存储在您的桌面上。

    第二个命令告诉xargs 告诉新的gem 安装“~/Desktop/old_gems”中列出的gem。 xargs 将防止 gem 在命令行中无法容纳的 gem 过多时不知所措。

    我在安装新版本的 Ruby 时使用了非常相似的方法,并且需要一组原始的 gem 来配合它。


    第一个命令抛出一个未初始化的常量错误...

    .../Library/Ruby/Site/1.8...

    问题可能是由于您的 Ruby 的年龄。 1.8 真的很旧并且已经被弃用多年,因此,我怀疑 gem 不知道 --no-version 标志。相反,试试这个:

    /usr/bin/gem list | awk '{print $1}' > ~/Desktop/old_gems
    xargs gem install < ~/Desktop/old_gems
    

    我找到了 rvm 使用系统命令...

    嗯...花时间阅读the RVM documentation 这样您就知道该工具的作用了。 rvm use system 是其最基本的命令之一,也是使用 RVM 或 rbenv 等沙箱的主要原因。有关该信息,请参阅“Setting the default Ruby”。

    此外,掌握 RVM 版本非常重要,以便您可以使用错误修复和新版本的 Ruby。请参阅“Upgrading RVM”了解如何操作。

    最后,当您需要了解 Ruby/RVM 生态系统的位置时,请使用rvm info

    【讨论】:

    • 感谢命令建议。这听起来完全像我希望做的。第一个命令抛出一个未初始化的常量错误:
    • Jim$ /usr/bin/gem list --no-version &gt; ~/Desktop/old_gems /Library/Ruby/Site/1.8/rubygems/config_file.rb:39: uninitialized constant Gem::UserInteraction (NameError) 然后列出了大约 30 个遇到问题的 Ruby 文件,所有这些文件都在 /Library/Ruby/Site?1.8/rubygems 中找到 如果我手动操作,我或我的项目会受到任何伤害重新安装宝石?将通过我的终端安装 gems 作为我的 2.0.0 gemset 的一部分运行 gem install 吗?谢谢。
    • 看起来问题出在寻找系统 ruby​​ 版本的现有项目中。在使用 rvm 运行 2.0.0 时,我无法在任何项目上使用 compass watch 或将这些项目上的代码推送到 github。我开始真的担心我已经破坏了一些重要的东西,但是在阅读了更多关于 rvm 的文档之后,我发现了 rvm use system 命令,它将 ruby​​ 恢复到原始版本。现在可以成功使用 compass 并推送到 github。呸!
    【解决方案2】:

    如果您使用的是 bundler 和 Gemfile,那么您应该不会遇到这种问题。事实上,使用 Bundler 和 Gemfile 的好处是有助于确保其他正在处理您项目的人也能够安装相同的 gem。

    /Library/Ruby/Gems 文件夹很可能来自系统安装,而不是您的 gem 的 RVM 安装。

    我相信这就是您找不到与您的经验相匹配的文档的原因,因为您之前的配置似乎是基于 Ruby 的系统安装,而不是使用 RVM 设置的项目。

    您将有几个选项来纠正此问题,但我建议使用 Gemfile,并使用 Bundler 来帮助管理您的项目。

    【讨论】:

    • 如您所说,我安装 rvm 之前的所有 gem 都安装到了 Ruby 的系统安装版本。您是否建议通过 rvm 运行捆绑程序?我目前在我的本地 gem 列表中有 rubygems-bundler (1.4.4)bundler (1.6.2)(可访问 rvm)。如果我只想手动为 2.0.0 重新安装 gem,那么最好的方法是什么,以便在下一次 ruby​​ 更新时,我可以运行一个简单的命令来更新所有 gem?
    • 我会在Gemfile 中指定gem,或者如果它是您正在构建的gem,那么name.gemspec 将是我放置这些信息的地方。如果你没有指定版本,或者指定最小版本,没有最大值,那么执行 bundle install 将安装每个指定 gem 的最新适当版本。 bundle update 会将 gem 更新到其当前版本,如 documentation 中所述。
    【解决方案3】:

    鉴于您的系统设置,您似乎使用的是 Mac,并且想要更新您在了解 RVM 之前安装的现有 gem。

    我最好的建议是使用以下方法获取您的原始宝石列表。

    /usr/bin/gem list
    

    如果您不想一个一个地安装它们,请尝试以下代码: http://www.krzywanski.net/archives/451

    对于最新版本,一点 ruby​​ 代码也可以解决问题。 ;)

    $ /usr/bin/gem list | ruby -ne 'puts("gem install #{$_.chomp.split[0]}")' >  ~/oldgems.sh
    $ chmod +x ~/oldgems.sh && cd
    $ ./oldgems.sh
    

    【讨论】:

    • 我喜欢这种能量。这将为您提供系统安装中安装的所有内容,尽管您可能仍需要编辑该列表以删除非项目特定的内容。但它肯定会让你得到那个列表来隔离那些。
    猜你喜欢
    • 2013-10-18
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多