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

Ignoring GEM because its extensions are not built

我最近使用 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,所以我 运行 gem install GEM 就解决了。

在家里,没有任何工作。

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

TL;DR - Ruby gems 不喜欢红宝石 运行 从符号链接或从它们的构建位置移动(因为嵌入的 shebangs)

如果调用 Ruby 目录或环境变量指向符号链接的目录,或者被复制或重命名,则可能会出现此消息。我正在使用 chruby 并且正在使用符号链接 /opt/rubies/ -> /usr/local/ruby/,但是 Ruby 的动态库查找逻辑在这方面表现不佳。

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

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

我今天遇到了这个确切的问题 - 对于甚至没有安装的 gems 收到这样的警告!

... 好吧,事实证明 安装了 gem - 与我用 chruby 设置的不同 ruby (2.2.3 与 2.3.1)。

切换到所有不同的红宝石和 运行 gem pristine --all 所有这些都解决了问题。

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

  • xcode-select --安装
  • 重新安装ruby
  • 重新安装所有 gems
  • gem 原始 --all

但我遇到了同样的问题。 我刚刚重新启动 Mac 作为最后的希望,警告消息消失了。

很奇怪,但是如果有人在 Whosebug 上尝试了所有方法后仍遇到此问题,请尝试重新启动您的计算机。

我 运行 进入这个问题并遵循与上面相同的所有命令,甚至删除了我以前安装的所有 Ruby 版本。但是,错误仍然存​​在。

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

我今天也遇到了这个问题,这让我很沮丧,因为我无法打字,因为我的整个编辑器都闪烁着红色并显示错误消息。

我不完全确定到底是什么原因造成的,但我相信是 因为我们有多个 ruby 版本或多个 ruby 版本管理器 已安装,它们会互相覆盖,否则会弄乱你通往宝石的道路。

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

通过键入查看您安装了哪些;

which rvm
which rbenv
which chruby

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


删除

这是我为 rvm;

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

这是我为 rbenv

所做的

首先安装https://github.com/meowsus/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

卸载并重新安装 Vagrant 也可以。安装程序 .dmg 映像中包含一个 unistall.tool bash 脚本,它将删除 Vagrant。

在这里找到了这个解决方案:Updating Vagrant and Gems Extentions Not Built In

如果您已经安装了 RVM,可能是因为您安装了不同的版本,所以您遇到了错误。

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

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

刷新cocoapods后,应该在.rvm中注入GEM_HOME

gem uninstall cocoapods
gem install cocoapods

可能pod COMMAND会抛出关于minitestgem的错误,所以-gem install minitest

开始一个新的终端会话(她对 Sebastian Kim 的回答发表了评论)对我有用。也比其他任何一个都快得多,所以我想把它作为一个答案,这样它就更显眼了。

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

rbenv 全局 2.5.1

这是一个旧线程,但我自己刚遇到这个问题。

你不需要重启你的机器,你只需要刷新你的环境,你可以用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.

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

When you do a "bundle install --deployment", bundler will create a vendor directory w/ your gems in it. Note that whilst this includes your gems in the local folder, it will only include the native extensions for your platform. As you're on macOS this will be Darwin. You'll need to do repeat the process on a 64-bit x86 linux environment.

在这里添加我自己的风味。我使用通过 Homebrew 安装的 rbenv 并收到其中四个 "ignoring... extensions not built" 消息。具体来说:

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 目录的权限被拒绝了。

所以我经历了每个 运行 原始 gem,就像

sudo gem pristine bcrypt --version 3.1.12 (等等)

最后错误消失了。

就我而言,我试图 运行 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 按预期工作

我遇到了这个问题,但只有在我使用 tmuxinator 开始 tmux 会话时才会遇到这个问题。

原来是因为我使用 brew 中的 tmuxinator 而不是使用 gem install 安装它。也许同时使用 chruby 也导致了这个问题。

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

运行 gem pristine --all 起初没有帮助,但后来我意识到:我的脚本是 运行 以行开头:

#!/usr/bin/ruby

在我的macOS系统上(Catalina,不过我觉得不重要),这个指向的是系统自带的Ruby,不是RVM安装的那个。 运行 gem pristine --all 正在修复 RVM 安装,但我的脚本调用了不同版本的 Ruby。

我的解决方法是使用 env 命令调用当前 shell 的 PATH 中指定的任何 Ruby。将脚本的第一行更改为此修复它:

#!/usr/bin/env ruby

运行 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 pristine 没有任何作用。

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

因此,请检查您是否没有在 ~/.zshrc

中设置 GEM_PATH 和 GEM_HOME

此解决方案适用于 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

如果您像我一样使用 rvm修复可以是一个简单的:

rvm get stable
rvm reload

如本回答所述https://apple.stackexchange.com/a/192513

我已经在终端中执行了这些命令并为我工作:

  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

在我的例子中,警告本身已经提出了解决方案,所以我只是 运行 一一解决。

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

所以运行宁每行的命令已经解决了我的问题。

这里的大多数评论都是正确的。 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 

在 Ubuntu 这对我有用。

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