我安装了rbenv并尝试按照https://github.com/rbenv/ruby-build/wiki的指示在Debian 9上安装ruby 1.9.3。
Debian上的OpenSSL绑定
由于Debian(7.5及更高版本)中的OpenSSL不兼容,因此Ruby可能无法在不先对其进行修补的情况下进行编译:curl -fsSL https://github.com/ruby/ruby/commit/1e7a929c1d44d7a368fbe379211183ac6c972920.patch | \ rbenv install --patch 1.9.3-p484
我得到的答复是
Installing ruby-1.9.3-p484...
patching file ChangeLog
Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED -- saving rejects to file ChangeLog.rej
patching file ext/openssl/ossl_ssl.c
Hunk #1 succeeded at 1985 (offset -244 lines).
BUILD FAILED (Debian 9.4 using ruby-build 20160913)
好吧,Ruby正常工作或运行时,不需要ChangeChange中的更改。然后我发现了这个https://github.com/mathbruyen/computers/blob/master/computers/AspireOne.md
curl -fsSL https://github.com/ruby/ruby/commit/1e7a929c1d44d7a368fbe379211183ac6c972920.patch | filterdiff --strip=1 -i a/ext/openssl/ossl_ssl.c | rbenv install -p 1.9.3-p484
,从中我找到了一种仅将大块文件应用于OpenSSL相关文件的方法。 Filterdiff可以安装在Debian:apt install patchutils
上。
安装Ruby 1.9.3-p484
BUILD FAILED (Debian 9.4 using ruby-build 20160913)
Inspect or clean up the working tree at /tmp/ruby-build.4890
Results logged to /tmp/ruby-build.4890.log
Last 10 log lines:
ossl_ssl_def_const(OP_ALL);
^~~~~~~~~~~~~~~~~~
Makefile:269: recipe for target 'ossl_ssl.o' failed
make[2]: *** [ossl_ssl.o] Error 1
make[2]: Leaving directory '/tmp/ruby-build.4890/ruby-1.9.3-p484/ext/openssl'
exts.mk:126: recipe for target 'ext/openssl/all' failed
make[1]: *** [ext/openssl/all] Error 2
make[1]: Leaving directory '/tmp/ruby-build.4890/ruby-1.9.3-p484'
uncommon.mk:178: recipe for target 'build-ext' failed
make: *** [build-ext] Error 2
现在我注意到仍然存在一个与openssl相关的错误。所以我尝试了另一个libssl-dev-package:
sudo apt install libssl-dev
现在安装ruby 1.9.3-p484没有任何错误,太棒了!但是,即使现在安装没有错误,openssl仍无法在ruby中使用。
user@debian:~$ rbenv rehash
user@debian:~$ rbenv versions
system
1.9.3-p484
user@debian:~$ rbenv local 1.9.3-p484
user@debian:~$ irb
irb(main):001:0> require 'openssl'
LoadError: cannot load such file -- openssl
from /home/user/.rbenv/versions/1.9.3-p484/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from /home/user/.rbenv/versions/1.9.3-p484/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from (irb):1
from /home/user/.rbenv/versions/1.9.3-p484/bin/irb:12:in `<main>'
irb(main):002:0>
编辑: 对于Ruby 1.9.3-p484,它在日志中表示:
Failed to configure openssl. It will not be installed.
这就是为什么安装成功,但是openssl无法正常工作的原因。在日志中寻找“错误”一词,我还发现“错误:未声明SSLv3_method”,该错误已在单独的补丁程序中修复。
Wiki还说明了以下所有内容:
2.4之前的Ruby版本的openssl扩展与OpenSSL 1.1.x不兼容。目前,大多数OpenSSL 1.1.0附带的Linux发行版都有一个单独的OpenSSL 1.0.x软件包。
在Debian 9(拉伸)上,它是libssl1.0-dev(注意,安装它会删除libssl-dev)。
和
OpenSSL“未声明SSLv3_method”错误
对于较旧的Ruby版本(如1.9.3),上述补丁将无法使用,请改用以下方法:curl -fsSL https://gist.github.com/FiveYellowMice/c50490693d47577cfe7e6ac9fc3bf6cf.txt | \ rbenv install --patch 1.9.3-p551
因此,在我的设置中,有效步骤是:
1. sudo apt install libssl1.0-dev
2. curl -fsSL https://gist.github.com/FiveYellowMice/c50490693d47577cfe7e6ac9fc3bf6cf.txt | rbenv install --patch 1.9.3-p551
现在可以正常使用了:
user@debian:~$ rbenv rehash
user@debian:~$ rbenv versions
system
* 1.9.3-p484 (set by /home/user/.ruby-version)
1.9.3-p551
user@debian:~$ rbenv local 1.9.3-p551
user@debian:~$ irb
irb(main):001:0> require 'openssl'
=> true
irb(main):002:0>
希望这会对某人有所帮助!