ruby - 为什么 Heroku 的 heroku-18 堆栈仅与 Puma 版本 3.7.x 兼容?

标签 ruby heroku rubygems puma

通过反复试验,我确定从 Heroku 的 heroku-16 堆栈升级到 heroku-18 堆栈需要我在 Rails 应用程序中更新 Puma。

下面是无法为 puma gem 构建 native 扩展。您能解释一下为什么 v3.7 之前的 puma gem 版本会出现这种故障吗?

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory:
/tmp/build_893b3955637fcd96d49136f0c3564c51/vendor/bundle/ruby/2.4.0/gems/puma-3.6.2/ext/puma_http11
/tmp/build_893b3955637fcd96d49136f0c3564c51/vendor/ruby-2.4.5/bin/ruby -r
./siteconf20190110-284-13d7ke9.rb extconf.rb
checking for BIO_read() in -lcrypto... yes
checking for SSL_CTX_new() in -lssl... yes
checking for openssl/bio.h... yes
creating Makefile

current directory:
/tmp/build_893b3955637fcd96d49136f0c3564c51/vendor/bundle/ruby/2.4.0/gems/puma-3.6.2/ext/puma_http11
make "DESTDIR=" clean

current directory:
/tmp/build_893b3955637fcd96d49136f0c3564c51/vendor/bundle/ruby/2.4.0/gems/puma-3.6.2/ext/puma_http11
make "DESTDIR="
compiling http11_parser.c
In file included from ext/puma_http11/http11_parser.rl:7:0:
ext/puma_http11/http11_parser.rl: In function ‘puma_parser_execute’:
ext/puma_http11/http11_parser.rl:111:17: warning: comparison between signed and
unsigned integer expressions [-Wsign-compare]
ext/puma_http11/http11_parser.rl: At top level:
cc1: warning: unrecognized command line option ‘-Wno-self-assign’
cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’
cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’
compiling io_buffer.c
compiling mini_ssl.c
mini_ssl.c: In function ‘get_dh1024’:
mini_ssl.c:90:5: error: dereferencing pointer to incomplete type ‘DH {aka struct
dh_st}’
   dh->p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), NULL);
     ^~
mini_ssl.c: In function ‘engine_init_server’:
mini_ssl.c:139:3: warning: ISO C90 forbids mixed declarations and code
[-Wdeclaration-after-statement]
   ID sym_cert = rb_intern("cert");
   ^~
mini_ssl.c:144:3: warning: ISO C90 forbids mixed declarations and code
[-Wdeclaration-after-statement]
   ID sym_ca = rb_intern("ca");
   ^~
mini_ssl.c:166:3: warning: ISO C90 forbids mixed declarations and code
[-Wdeclaration-after-statement]
   DH *dh = get_dh1024();
   ^~
mini_ssl.c:170:3: warning: ISO C90 forbids mixed declarations and code
[-Wdeclaration-after-statement]
   EC_KEY *ecdh = EC_KEY_new_by_curve_name(NID_secp521r1);
   ^~~~~~
mini_ssl.c: In function ‘engine_init_client’:
mini_ssl.c:197:3: warning: ‘DTLSv1_method’ is deprecated
[-Wdeprecated-declarations]
   conn->ctx = SSL_CTX_new(DTLSv1_method());
   ^~~~
In file included from /usr/include/openssl/ct.h:13:0,
                 from /usr/include/openssl/ssl.h:61,
                 from mini_ssl.c:15:
/usr/include/openssl/ssl.h:1642:1: note: declared here
 DEPRECATEDIN_1_1_0(__owur const SSL_METHOD *DTLSv1_method(void)) /* DTLSv1.0 */
 ^
mini_ssl.c: In function ‘engine_shutdown’:
mini_ssl.c:333:8: warning: unused variable ‘buf’ [-Wunused-variable]
   char buf[512];
        ^~~
mini_ssl.c:332:11: warning: unused variable ‘err’ [-Wunused-variable]
   int ok, err;
           ^~~
mini_ssl.c: In function ‘engine_init’:
mini_ssl.c:350:8: warning: unused variable ‘buf’ [-Wunused-variable]
   char buf[512];
        ^~~
mini_ssl.c:349:11: warning: unused variable ‘err’ [-Wunused-variable]
   int ok, err;
           ^~~
mini_ssl.c:349:7: warning: unused variable ‘ok’ [-Wunused-variable]
   int ok, err;
       ^~
mini_ssl.c: At top level:
cc1: warning: unrecognized command line option ‘-Wno-self-assign’
cc1: warning: unrecognized command line option ‘-Wno-constant-logical-operand’
cc1: warning: unrecognized command line option ‘-Wno-parentheses-equality’
Makefile:241: recipe for target 'mini_ssl.o' failed
make: *** [mini_ssl.o] Error 1

make failed, exit code 2

Gem files will remain installed in
/tmp/build_893b3955637fcd96d49136f0c3564c51/vendor/bundle/ruby/2.4.0/gems/puma-3.6.2
for inspection.
Results logged to
/tmp/build_893b3955637fcd96d49136f0c3564c51/vendor/bundle/ruby/2.4.0/extensions/x86_64-linux/2.4.0-static/puma-3.6.2/gem_make.out

An error occurred while installing puma (3.6.2), and Bundler cannot continue.
Make sure that `gem install puma -v '3.6.2'` succeeds before bundling.

最佳答案

Heroku-16堆栈基于 Ubuntu 16.04,它附带 OpenSSL 1.0.2 而 Heroku-18堆栈基于随 OpenSSL 1.1.0 一起提供的 Ubuntu 18.04。

在这些 OpenSSL 版本之间,有相当多的 API 和行为更改,这通常需要对直接使用 OpenSSL API 的软件进行一些更改(就像 Puma 所做的那样)。

在 Puma 3.7.0 中,有 a change使其与 OpenSSL 1.1.0 兼容,从而使其成为第一个与该版本兼容的版本。

关于ruby - 为什么 Heroku 的 heroku-18 堆栈仅与 Puma 版本 3.7.x 兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54123750/

相关文章:

ruby - 开发 gem 时读取文件(在 lib 下)的最佳做法是什么?

ruby-on-rails - Mountain Lion 上的 pg gem '0.14.0' 失败

ruby-on-rails - 如何在 has_many_through 关系中保存额外字段

ruby - Scheduler 插件每月在 Heroku 上占用多少小时?

ruby-on-rails - Heroku 上的 ffmpeg : unrecognized option 'preset'

git - 将不同的分支推送到 Heroku

ruby - 如何在 10.10 Yosemite 上安装 therubyracer gem?

ruby - Rake 任务排序

ruby - gsub - 如何成为高效的 leet 生成器

php - 如何让 Ruby AES-256-CBC 和 PHP MCRYPT_RIJNDAEL_128 很好地协同工作