坚固的 gem 无法构建本机扩展

问题描述

OS: Ubuntu 18.04
GCC version: gcc version 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
JRuby version: 9.2.8.0
Ruby version: 2.5.3

问题来源:尝试安装 pronto gem(0.11.0 版)

运行 gem install pronto 时,gem 安装在依赖 rugged gem 尝试构建本机扩展时失败,并出现以下错误

-- Build files have been written to: /home/ubuntu/.rvm/gems/jruby-9.2.8.0/gems/rugged-1.0.1/vendor/libgit2/build
 -- /usr/bin/make
checking for main() in -lgit2... RuntimeError: The compiler Failed to generate an executable file.
You have to install development tools first.

        try_do at /home/ubuntu/.rvm/rubies/jruby-9.2.8.0/lib/ruby/stdlib/mkmf.rb:456
     try_link0 at /home/ubuntu/.rvm/rubies/jruby-9.2.8.0/lib/ruby/stdlib/mkmf.rb:541
      try_link at /home/ubuntu/.rvm/rubies/jruby-9.2.8.0/lib/ruby/stdlib/mkmf.rb:556
      try_func at /home/ubuntu/.rvm/rubies/jruby-9.2.8.0/lib/ruby/stdlib/mkmf.rb:765
  have_library at /home/ubuntu/.rvm/rubies/jruby-9.2.8.0/lib/ruby/stdlib/mkmf.rb:997
  checking_for at /home/ubuntu/.rvm/rubies/jruby-9.2.8.0/lib/ruby/stdlib/mkmf.rb:942
      postpone at /home/ubuntu/.rvm/rubies/jruby-9.2.8.0/lib/ruby/stdlib/mkmf.rb:350
          open at /home/ubuntu/.rvm/rubies/jruby-9.2.8.0/lib/ruby/stdlib/mkmf.rb:320
      postpone at /home/ubuntu/.rvm/rubies/jruby-9.2.8.0/lib/ruby/stdlib/mkmf.rb:350
          open at /home/ubuntu/.rvm/rubies/jruby-9.2.8.0/lib/ruby/stdlib/mkmf.rb:320
      postpone at /home/ubuntu/.rvm/rubies/jruby-9.2.8.0/lib/ruby/stdlib/mkmf.rb:346
  checking_for at /home/ubuntu/.rvm/rubies/jruby-9.2.8.0/lib/ruby/stdlib/mkmf.rb:941
  have_library at /home/ubuntu/.rvm/rubies/jruby-9.2.8.0/lib/ruby/stdlib/mkmf.rb:992
        <main> at extconf.rb:137
*** extconf.rb Failed ***
Could not create Makefile due to some reason,probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
    --with-opt-dir
    --without-opt-dir
    --with-opt-include
    --without-opt-include=${opt-dir}/include
    --with-opt-lib
    --without-opt-lib=${opt-dir}/lib
    --with-make-prog
    --without-make-prog
    --srcdir=.
    --curdir
    --ruby=/home/ubuntu/.rvm/rubies/jruby-9.2.8.0/bin/jruby
    --with-sha1dc
    --without-sha1dc
    --use-system-libraries
    --with-git2-dir
    --without-git2-dir
    --with-git2-include
    --without-git2-include=${git2-dir}/include
    --with-git2-lib
    --without-git2-lib=${git2-dir}/lib
    --with-git2lib
    --without-git2lib

我尝试了不同的方法来让它工作,但它们都失败了,并出现了相同的错误

  1. 独立运行gem install rugged
  2. 克隆 rugged git 存储库并手动构建代码
  3. 手动构建 libgit2,然后构建 rugged 存储库。

请告诉我是否存在此问题的解决方案,或者是否有其他方法来处理以下 pronto 命令:
PRONTO_GITHUB_ACCESS_TOKEN=<access_token> pronto run -c origin/master -f github_pr_review

我最初的问题是我想使用 CI 在我的拉取请求上运行 rubocop 1.17 版。 rubocop 应该只在拉取请求中存在的更改的 ruby​​ 代码行上运行,而不是在整个文件上运行。

解决方法

JRuby 似乎不支持 C 扩展/库。所以我必须安装 ruby​​-2.5,然后手动安装 gems。以下是我所做的步骤:

  1. rvm install ruby-2.5.8
  2. rvm use ruby-2.5.8
  3. gem install rubocop -v 1.17.0
  4. gem install pronto -v 0.11.0
  5. gem install pronto-rubocop -v 0.11.1

现在我可以成功执行 pronto 命令了。遗憾的是,不能在这个文件上使用 bundle install,因为我的 Gemfile 有 JRuby 依赖的 gem。