忽略GEM,因为它的扩展未构建

时间:2016-08-05 20:39:12

标签: ruby rubygems chruby

在我的工作和家用计算机上,我最近使用ruby-install将Ruby升级到2.3.1。我使用chruby作为我的Ruby切换器。

我开始在终端看到这个警告:

Ignoring bcrypt-3.1.11 because its extensions are not built.  Try: gem pristine bcrypt --version 3.1.11
Ignoring bcrypt-3.1.10 because its extensions are not built.  Try: gem pristine bcrypt --version 3.1.10
Ignoring binding_of_caller-0.7.2 because its extensions are not built.  Try: gem pristine binding_of_caller --version 0.7.2
Ignoring byebug-9.0.5 because its extensions are not built.  Try: gem pristine byebug --version 9.0.5
Ignoring byebug-5.0.0 because its extensions are not built.  Try: gem pristine byebug --version 5.0.0
Ignoring concurrent-ruby-ext-1.0.2 because its extensions are not built.  Try: gem pristine concurrent-ruby-ext --version 1.0.2
Ignoring debug_inspector-0.0.2 because its extensions are not built.  Try: gem pristine debug_inspector --version 0.0.2

在我的工作,计算机上,列表要长得多,但很容易解决。当我尝试使用建议的gem pristine GEM时,它告诉我它无法找到宝石,所以我运行了gem install GEM,这解决了它。

在家里,什么都没有用。

我尝试过的事情,从常识和其他各种Stack问题:

  • gem pristine GEM
  • gem pristine --all
  • 卸载并重新安装gem
  • gem update
  • gem update --system
  • bundle update
  • 卸载并重新安装bundler
  • 卸载并重新安装rails(虽然,这不是Rails特定的问题。)
  • 删除~/.bundle/
  • 打开XCode并让它安装一些扩展程序(确实需要这样做,但它没有修复任何内容。)
  • 正在运行brew doctor并解决所有小问题,然后brew updatebrew upgrade
  • gem install curb(我无法想象这个宝石与此问题有什么关系,但有两个人将其列为修复同一警告的最后一步。)

23 个答案:

答案 0 :(得分:123)

我今天遇到了这个问题 - 对于甚至没有安装的宝石都会收到这样的警告!

......好吧,事实证明 安装了宝石 - 用于与我用chruby设置的红宝石不同的红宝石(2.2.3 vs 2.3.1)。

切换到所有不同的红宝石并在所有红宝石上运行gem pristine --all解决了这个问题。

答案 1 :(得分:13)

我遇到了这个问题并遵循了上述所有相同的命令,甚至还删除了我以前安装的所有Ruby版本。但是,错误仍然存​​在。

事实证明,~/.gem/ruby/中的各种(以前未安装的)版本有一些剩余的宝石。删除我不再使用的文件夹后,错误消失了。

答案 2 :(得分:6)

我今天也遇到了这个问题而且很沮丧,因为我无法输入,因为我的整个编辑器都闪烁着红色的错误消息。

我不完全确定究竟是什么导致了它,但我认为它是因为我们有多个ruby版本或多个ruby版本管理器 已安装并且它们互相覆盖,否则弄乱你走向宝石的道路。

当你有rbenv和rvm时,gem命令也会被覆盖。

通过键入来查看您已安装的那些;

which rvm
which rbenv
which chruby

如果安装了其中一个,它将返回一个路径。然后删除它们,确保完全清除所有目录并从干净安装开始。

删除

这是我为 rvm ;

所做的
rvm implode
gem uninstall rvm
rm -rf ~/.rvm
rm -rf ~/.rvmrc

这是我为 rbenv

所做的

首先安装https://github.com/bernsie/rbenv-clean,然后

rbenv clean
sudo apt-get remove rbenv
rm -rf ~/.rbenv

<强>重新安装

然后你有一个干净的家庭目录。我用How to install Ruby 2.1.4 on Ubuntu 14.04重新安排了rbenv。最后;

rbenv rehash

答案 3 :(得分:4)

我做了上面提到的所有事情,包括

  • xcode-select --install
  • 重新安装ruby
  • 重新安装所有宝石
  • gem pristine --all

但问题对我来说是一样的。 我刚刚重新启动我的Mac作为最后的希望,警告信息消失了。

很奇怪,但如果有人在尝试StackOverflow上的所有内容后遇到此问题,请尝试重新启动计算机。

答案 4 :(得分:2)

TL; DR - Ruby宝石不喜欢从符号链接运行的Rubies或者从它们构建的地方移动(因为嵌入式shebangs)

如果调用Ruby目录或环境变量指向符号链接目录,或者复制或重命名,则可能出现此消息。我正在使用chruby并且是符号链接/opt/rubies/ - &gt; /usr/local/ruby/,但Ruby的动态库查找逻辑并不能很好地发挥作用。

我的解决方案是用/opt/rubies/中的实际红宝石替换符号链接,并在每个Ruby中运行gem pristine --all。对于使用RVM或Rbenv的其他人来说,祝你好运,而无需从头开始。

这可能不是您的确切问题,但希望它有所帮助。

答案 5 :(得分:2)

如果已安装RVM,则可能是由于安装了不同版本而捕获了该错误。

检查并删除无用的版本, 但是我认为这是不好的方法。 反正错误消失了。

rvm list
rvm use ruby-version
rvm remove ruby-useless-version

刷新椰子后,应将其注入.rvm GEM_HOME

gem uninstall cocoapods
gem install cocoapods

可能pod COMMAND会引发关于minitest gem的错误,因此– gem install minitest

答案 6 :(得分:2)

这里的大多数评论都在正确的轨道上。这个问题经常发生在 Ruby 版本升级之后。我查看了 gem 命令代码,这里是它的要点。

扩展被编译到 gems 主目录的 gems/gem/ext 子目录中。例如,在我的 Cygwin 安装中(在 Raspbian 下也类似),BigDecimal 扩展被编译为 /usr/share/gems/gems/bigdecimal-1.3.5/ext/bigdecimal/bigdecimal.so。

然而,这是不是在执行时引用扩展的地方 - 即来自 /usr/lib/gems/ruby/ver/gem。再次使用 BigDecimal,执行时的扩展文件是从 /usr/lib/gems/ruby/2.3.0/bigdecimal-1.3.5/bigdecimal.so

这里是关键:在同一个目录下,有一个空的标签文件 /usr/lib/gems/ruby/2.3.0/bigdecimal-1.3.5/gem.build_complete

gem 命令启动时,它会引用 gems/specifications 目录以获取已安装的 gem 列表以及有关它们是否具有扩展的信息。如果 gem 确实有扩展名,gem(以及其他健全性检查)会查找标记文件 gem.build_complete。如果没有找到,它会发出错误消息“忽略 gem 因为它的扩展没有构建”。

任何重建所有扩展的操作都会解决这个问题。或者,作为一个完全的黑客,如果你又急又勇敢,你可以尝试将 /usr/lib/gems/ruby/oldver 的所有内容复制到 /usr/lib/gems/ruby/更新 例如

cd /usr/lib/gems/ruby
cp -nv 2.3.0/* 2.6 

答案 7 :(得分:2)

就我而言,警告本身已经提出了解决方案,所以我只是一一运行它们。

Ignoring bigdecimal-2.0.0 because its extensions are not built. Try: gem pristine bigdecimal --version 2.0.0
Ignoring date-3.0.1 because its extensions are not built. Try: gem pristine date --version 3.0.1
Ignoring dbm-1.1.0 because its extensions are not built. Try: gem pristine dbm --version 1.1.0
Ignoring etc-1.1.0 because its extensions are not built. Try: gem pristine etc --version 1.1.0

这里有一个例子:

gem pristine bigdecimal --version 2.0.0

所以运行每一行的命令解决了我的问题。

答案 8 :(得分:2)

开始运行gem pristine --all并没有帮助,但是后来我意识到:我正在运行的脚本从以下一行开始:

#!/usr/bin/ruby

在我的macOS系统(Catalina,但我不认为这很重要)上,这指向系统随附的Ruby,而不是RVM安装的Ruby。运行gem pristine --all可以修复RVM的安装问题,但是我的脚本正在调用其他版本的Ruby。

对我来说,解决方法是使用env命令调用当前shell的PATH中指定的任何Ruby。将脚本的第一行更改为此可以解决:

#!/usr/bin/env ruby

答案 9 :(得分:1)

运行Mac OS Catalina,brew和rbenv ...

今天遇到了这个确切的问题,并在这里进行了所有回答,最终我偶然发现了此错误的另一个原因:

Ignoring nokogiri 1.10.7 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.7

当然,原始宝石没有任何作用。

我的问题是硬编码的GEM_HOME和GEM_PATH环境变量覆盖了rbenv。

因此,请检查您是否未在〜/ .zshrc中设置GEM_PATH和GEM_HOME

答案 10 :(得分:1)

我遇到了这个问题,但是仅当我使用tmux开始tmuxinator会话时。

原来是因为我正在使用tmuxinator中的brew,而不是使用gem install安装它。也许同时使用chruby也会导致此问题。

p / s:我还从~/.gem/ruby中删除了未使用的红宝石,但我怀疑这就是为我解决此问题的原因。

答案 11 :(得分:0)

在 Ubuntu 中,这对我有用。

  1. source ~/.bash_profile
  2. sudo gem pristine --all

答案 12 :(得分:0)

我已经在Terminal中执行了以下命令并为我工作:

  1. /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  2. brew install ruby,可能需要sudo(sudo brew install ruby​​)。
  3. echo 'export PATH="/usr/local/opt/ruby/bin:$PATH"' >> ~/.bash_profile
  4. source ~/.bash_profile
  5. sudo gem pristine --all

答案 13 :(得分:0)

如果您像我一样使用var,则修复很简单

rvm

如该答案https://apple.stackexchange.com/a/192513

所述

答案 14 :(得分:0)

此解决方案适用于 RubyMine IntelliJ

我使用了两个不同的终端,分别是RVMruby<Version>

解决方案:

我不得不将其切换到RVM版本,以使错误在Preferences>Languages&Frameworks>Ruby SDK中消失

错误:

Ignoring executable-hooks-1.6.0 because its extensions are not built. Try: gem pristine executable-hooks --version 1.6.0 rubymine

Ignoring gem-wrappers-1.4.0 because its extensions are not built. Try: gem pristine gem-wrappers --version 1.4.0

enter image description here

答案 15 :(得分:0)

只需输入此命令

sudo gem pristine --all

对我有用吗

答案 16 :(得分:0)

就我而言,我试图运行pristine --all,但我得到了:

Ignoring ffi-1.11.1 because its extensions are not built.  Try: gem pristine ffi --version 1.11.1
Ignoring jaro_winkler-1.5.3 because its extensions are not built.  Try: gem pristine jaro_winkler --version 1.5.3
Ignoring psych-3.1.0 because its extensions are not built.  Try: gem pristine psych --version 3.1.0
/.rbenv/versions/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': incompatible library version - /.gem/gems/psych-3.1.0/lib/psych.bundle (fatal) 

然后,我删除了Users/{{user.name}}⁩/⁨.gem⁩上的内容,然后在需要运行bundle install --force时,它重新安装了所有内容,然后命令pristine --all按预期工作了

答案 17 :(得分:0)

在这里添加我自己的风味。我使用通过Homebrew安装的rbenv,并收到其中四个“忽略...未建立扩展”消息。具体来说:

Ignoring bcrypt-3.1.12 because its extensions are not built.  Try: gem pristine bcrypt --version 3.1.12
Ignoring bindex-0.5.0 because its extensions are not built.  Try: gem pristine bindex --version 0.5.0
Ignoring bootsnap-1.3.2 because its extensions are not built.  Try: gem pristine bootsnap --version 1.3.2
Ignoring byebug-10.0.2 because its extensions are not built.  Try: gem pristine byebug --version 10.0.2

我在这个线程中尝试了很多事情,但是没有运气。最终我做到了:

  • brew uninstall rbenv
  • rm -rf ~/.rbenv
  • brew install rbenv

这时我仍然遇到错误,但是现在我只有一个Ruby版本可以解决:

$ rbenv versions
* system (set by /Users/will/.rbenv/version)

这时我尝试了sudo gem pristine --all,但是由于对系统Gems目录的访问权限而被拒绝。

所以我经历了每个宝石的原始过程,就像

sudo gem pristine bcrypt --version 3.1.12(等)

最后错误消失了。

答案 18 :(得分:0)

在Mac上进行开发,然后构建Docker映像时,这也是一个问题: https://forums.aws.amazon.com/thread.jspa?messageID=879802&tstart=0

  

当您执行“捆绑安装--deployment”时,捆绑器将创建一个   供应商目录,其中包含您的宝石。请注意,尽管这包括   您在本地文件夹中的宝石,它将仅包含本地宝石   您平台的扩展。当您在macOS上时,它将是Darwin。   您需要在64位x86 linux上重复该过程   环境。

答案 19 :(得分:0)

这是一个老话题,但我本人只是遇到了这个问题。

您不需要重启计算机,只需要刷新环境即可,您可以使用rehash命令来完成此操作:

rehash

在手册页中:rehash command re-computes the internal hash table of the contents of directories listed in the path environmental variable to account for new commands added.

答案 20 :(得分:0)

我遇到了同样的问题,并且正在使用rbenv。由于某种原因,我的全局rbenv设置丢失了。为了解决此问题,我将全局版本设置为我的rbenv版本之一...例如:

rbenv全局2.5.1

答案 21 :(得分:0)

Libby建议刚开始一个新的终端会话(她对Sebastian Kim的回答进行了评论)对我有用。速度也比其他任何一个都要快,所以我想让它成为一个答案,这样它就更加可见。

答案 22 :(得分:0)

卸载并重新安装Vagrant也可以。安装程序.dmg图像中包含一个<servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> ... <init-param> <param-name>mappedfile</param-name> <param-value>false</param-value> </init-param> ... </servlet> bash脚本,它将删除Vagrant。

在此处找到此解决方案:Arbitrary queries on n:m relationship, including “all” and “any”