Ruby - 2.3.2 ビルドインストール時のエラー!
Updated:
Ruby 2.3.2 をソースをビルドしてインストールする際にエラーが出力されるので、調査して対策してみました。
調べてみると、実際は 2.3.1 から同じようなエラーになるようですが、自分が 2.3.1 をソースビルドでインストールした時には気付きませんでした。
0. 前提条件
- LMDE2(Linux Mint Debian Edition 2) での作業を想定。
1. 現象
.configure
, make
後に sudo make install
すると、以下のようなエラーを出力して終了する。
/home/foo/ruby-2.3.2/lib/rubygems/installer.rb:233:in `check_executable_overwrite': no implicit conversion of nil into String (TypeError)
from /home/foo/ruby-2.3.2/lib/rubygems/installer.rb:474:in `block in generate_bin'
from /home/foo/ruby-2.3.2/lib/rubygems/installer.rb:461:in `each'
from /home/foo/ruby-2.3.2/lib/rubygems/installer.rb:461:in `generate_bin'
from /home/foo/ruby-2.3.2/lib/rubygems/installer.rb:301:in `install'
from ./tool/rbinstall.rb:686:in `call'
from ./tool/rbinstall.rb:686:in `block in <class:Installer>'
from ./tool/rbinstall.rb:754:in `block (2 levels) in <main>'
from /home/foo/ruby-2.3.2/lib/rubygems/specification.rb:821:in `block in each_spec'
from /home/foo/ruby-2.3.2/lib/rubygems/specification.rb:743:in `block (2 levels) in each_gemspec'
from /home/foo/ruby-2.3.2/lib/rubygems/specification.rb:742:in `each'
from /home/foo/ruby-2.3.2/lib/rubygems/specification.rb:742:in `block in each_gemspec'
from /home/foo/ruby-2.3.2/lib/rubygems/specification.rb:741:in `each'
from /home/foo/ruby-2.3.2/lib/rubygems/specification.rb:741:in `each_gemspec'
from /home/foo/ruby-2.3.2/lib/rubygems/specification.rb:819:in `each_spec'
from ./tool/rbinstall.rb:751:in `block in <main>'
from ./tool/rbinstall.rb:801:in `block in <main>'
from ./tool/rbinstall.rb:798:in `each'
from ./tool/rbinstall.rb:798:in `<main>'
uncommon.mk:260: recipe for target 'do-install-all' failed
make: *** [do-install-all] Error 1
但し、 ruby -v
を実行すると正常にバージョンが出力されるし、 irb
も正常に機能する。
エラーメッセージから判断するに、 RubyGems 周りがおかしいのかもしれない。
2. 原因
“lib/rubygems/installer.rb” の 233 行目を含む check_executable_overwrite filename
メソッドを眺めてみる。
※233行目は、 question << existing
の行(以下の37行目)
(行ハイライト等のオプションが効かないバージョンの Octopress なので(参考:BUG: start, mark, and linenos don’t work in code blocks · Issue #1472 · imathis/octopress))
File: /home/foo/ruby-2.3.2/lib/rubygems/installer.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
def check_executable_overwrite filename # :nodoc:
return if @force
generated_bin = File.join @bin_dir, formatted_program_filename(filename)
return unless File.exist? generated_bin
ruby_executable = false
existing = nil
open generated_bin, 'rb' do |io|
next unless io.gets =~ /^#!/ # shebang
io.gets # blankline
# TODO detect a specially formatted comment instead of trying
# to run a regexp against Ruby code.
next unless io.gets =~ /This file was generated by RubyGems/
ruby_executable = true
existing = io.read.slice(%r{
^(
gem \s |
load \s Gem\.bin_path\(
)
(['"])(.*?)(\2),
}x, 3)
end
return if spec.name == existing
# somebody has written to RubyGems' directory, overwrite, too bad
return if Gem.default_bindir != @bin_dir and not ruby_executable
question = "#{spec.name}'s executable \"#{filename}\" conflicts with ".dup
if ruby_executable then
question << existing
return if ask_yes_no "#{question}\nOverwrite the executable?", false
conflict = "installed executable from #{existing}"
else
question << generated_bin
return if ask_yes_no "#{question}\nOverwrite the executable?", false
conflict = generated_bin
end
raise Gem::InstallError,
"\"#{filename}\" from #{spec.name} conflicts with #{conflict}"
end
どうやら、String 変数 question
に existing
を連結しようとしているが、 existing
が nil になることあるようだ。
3. 対策
該当のメソッドしか目を通していないので、これが根本的な対策となるか不明だが、 “lib/rubygems/installer.rb” の 233 行目を以下のように変更した。
File: /home/foo/ruby-2.3.2/lib/rubygems/installer.rb
1
2
3
4
5
6
7
8
@@ -230,7 +230,7 @@
question = "#{spec.name}'s executable \"#{filename}\" conflicts with ".dup
if ruby_executable then
- question << existing
+ question << (existing || 'an unknown executable')
return if ask_yes_no "#{question}\nOverwrite the executable?", false
この後、再度 sudo make install
を流して、正常にインストールが終了することを確認する。
また、RubyGems ライブラリのインストールが問題なく行えること、その他各種動作が正常であることも確認する。
4. 参考サイト
以上。
Comments