【问题标题】:Ignoring GEM because its extensions are not built忽略 GEM,因为它的扩展没有构建
【发布时间】:2016-12-12 08:30:44
【问题描述】:

在我的工作和家用计算机上,我最近使用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,并且解决了它。

在家里,什么都做不了。

我尝试过的事情,来自常识和其他各种堆栈问题:

  • 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(我无法想象这个 gem 与这个问题有什么关系,但是两个不同的人将它列为他们修复同一警告的最后一步。)

【问题讨论】:

  • 如果未安装 gem,我什至会看到相同的警告。我卸载了bcrypt,但它仍然给了我两个警告。
  • 你更新了 bundler 吗?卸载和重新安装只会使用 Gemfile.lock 中的任何内容。 Bundler 是构建扩展的人。此外,您的输出列出了多个版本的 gem,因此您应该知道该版本的 ruby​​ 是系统范围的(这意味着您将要重建多个 gem)。
  • 我在我的主文件夹中,不是 Rails 项目,所以没有 Gemfile。
  • 我也遇到了同样的问题(使用 rvm)。 gem pristine --all 没用。通过删除包括捆绑器在内的所有宝石来解决。然后安装了 bundler gem install bundler,最后导航回我的项目并运行 bundle install,它重新安装了我所有的 gem,一切正常
  • 就我而言,它是由 vim 扩展引起的。我做了 alias vim="rvm use system do vim" 来解决它。但我只在退出 vim 时看到了警告,所以如果你在其他情况下看到它,这可能不适用。

标签: ruby rubygems chruby


【解决方案1】:

在 Ubuntu 中,这对我有用。

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

【讨论】:

    【解决方案2】:

    这里的大多数 cmets 都在正确的轨道上。这个问题经常出现在 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/newver 例如

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

    【讨论】:

      【解决方案3】:

      在我的情况下,警告本身已经提出了解决方案,所以我只是一个一个地运行它们。

      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
      

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

      【讨论】:

        【解决方案4】:

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

        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

        【讨论】:

          【解决方案5】:

          如果你像我一样使用rvm修复可以很简单

          rvm get stable
          rvm reload
          

          正如这个答案中所述https://apple.stackexchange.com/a/192513

          【讨论】:

            【解决方案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/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
            

            【讨论】:

            • 删除 rvm 相关的东西为我在 macOS 上解决了这个问题
            • 这解决了我的 msfconsole(又名 metasploit)问题
            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              运行 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

              【讨论】:

                【解决方案9】:

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

                #!/usr/bin/ruby

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

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

                #!/usr/bin/env ruby

                【讨论】:

                • 刚刚发生在我身上——谢谢!这意味着bundle install 为通过 RVM Ruby 切换器选择的 ruby​​ 安装了 gem(及其本机扩展),其中引用系统 Ruby 的脚本找不到它们。您的解决方案是使 Ruby 脚本和 gem 与用户安装的 rubies (see) 一起工作的标准做法。
                • 这让我走上了正轨!就我而言,我希望 tmuxinator 成为一个实用程序(而不是特定项目的捆绑 dep),所以我很容易将它安装在 Ubuntu 上。这样做apt purge tmuxinator 然后gem install tmuxinator 使它工作。每当我升级我的非项目 ruby​​ 版本时,我可能都必须安装它,但我更喜欢这个。谢谢!
                • 我希望我能投票三次。为我解决了。
                【解决方案10】:

                我遇到了这个问题,但只是在我使用 tmuxinator 启动 tmux 会话时。

                原来是因为我使用来自brewtmuxinator 而不是使用gem install 安装它。也许同时使用chruby 也会导致问题。

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

                【讨论】:

                  【解决方案11】:

                  在我的情况下,我试图运行 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按预期工作

                  【讨论】:

                    【解决方案12】:

                    Libby's suggestion 刚刚开始一个新的终端会话(她对 Sebastian Kim 的回答发表了评论)对我有用。也比其他任何人都快得多,所以我想将其作为答案,以便更明显。

                    【讨论】:

                      【解决方案13】:

                      在这里添加我自己的味道。我使用通过 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(等)

                      最后错误消失了。

                      【讨论】:

                      • 太棒了,这拯救了我的一天!我尝试了您回答之前提到的所有其他内容,但没有成功。只有你的程序适合我。谢谢!
                      【解决方案14】:

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

                      当您执行“bundle install --deployment”时,bundler 将创建一个 供应商目录,其中包含您的宝石。请注意,虽然这包括 您在本地文件夹中的宝石,它只会包括本机 为您的平台扩展。当您在 macOS 上时,这将是 Darwin。 您需要在 64 位 x86 linux 上重复该过程 环境。

                      【讨论】:

                        【解决方案15】:

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

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

                        【讨论】:

                        • 你在说什么操作系统?
                        • rehashhash -r for bash 是 *nix 上可用的 shell 命令。当 C shell 启动时,它会为其路径中的所有命令构建一个哈希表:每个命令名及其绝对路径名。所以,在你启动一个csh运行之后,如果新的程序沿着路径添加到目录中,你需要使用shell的rehash命令来重建它的hash表。 (参见:docstore.mik.ua/orelly/unix3/upt/ch27_06.htm
                        • 这个!关键是即使使用rbenv,我也遇到了这个问题,但我忘记使用rbenv rehash,所以内部仍然指向系统Ruby(macos)而不是新安装的系统......阅读太多了;-)
                        【解决方案16】:

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

                        rbenv 全球 2.5.1

                        【讨论】:

                          【解决方案17】:

                          如果您安装了 RVM,您可能会因为安装了不同的版本而遇到错误。

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

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

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

                          gem uninstall cocoapods
                          gem install cocoapods
                          

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

                          【讨论】:

                            【解决方案18】:

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

                            在此处找到此解决方案:Updating Vagrant and Gems Extentions Not Built In

                            【讨论】:

                              【解决方案19】:

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

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

                              【讨论】:

                              • 这是为我做的。 rm -rf。我之前曾尝试以原始方式安装我的所有 gem,但无济于事。
                              • ruby-installchruby 切换到 asdf 后,这也为我修复了它
                              • 这个已修复sudo rm -rf ~/.gem/ruby/
                              【解决方案20】:

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

                              • xcode-select --install
                              • 重新安装 ruby​​
                              • 重新安装所有 gems
                              • 宝石原始--全部

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

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

                              【讨论】:

                              • 感谢分享重启提示。我在 Mac 上遇到了同样的问题,只需启动新的终端会话即可解决。
                              【解决方案21】:

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

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

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

                              【讨论】:

                              • 这对我有用,仅在当前的 ruby​​ 上执行此操作(我使用 rvm)。也许这可以防止某人做太多的清理工作;)
                              • 有时gem pristine --all 没有用。有关更多信息,请参阅 Ask Different 上的 this answer
                              • 如果gem pristine --all有权限问题,你应该检查which rubybrew link --overwrite ruby && source ~/.bash_profile 并运行 gem pristine --all 可能会有所帮助
                              • 这些解决方案都不适合我,我也有同样的问题。
                              • gem pristine --all 让我陷入了几个麻烦,我强烈建议不要随意使用它
                              【解决方案22】:

                              TL;DR - Ruby gem 不喜欢从符号链接运行或从构建位置移动的 Ruby(因为嵌入的 shebang)

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

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

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

                              【讨论】:

                              • 原来是运行gem pristine --all 在所有这些部分。感谢您复活这个死问题。我差点把它烧掉然后重新开始。
                              猜你喜欢
                              • 2018-06-28
                              • 2021-02-18
                              • 2017-01-30
                              • 2015-08-23
                              • 2021-03-30
                              • 2018-04-13
                              • 1970-01-01
                              • 2019-01-29
                              • 1970-01-01
                              相关资源
                              最近更新 更多