5

シナリオ

Ruby 2.1.5 (x64)パッケージをインストールしてから、Ocra gemを正常にインストールしました。

gem install ocra
Fetching: ocra-1.3.3.gem (100%)
Successfully installed ocra-1.3.3
Parsing documentation for ocra-1.3.3
Installing ri documentation for ocra-1.3.3
Done installing documentation for ocra after 0 seconds
1 gem installed

問題

テストスクリプトをパックしようとしています:

# -*- coding: UTF-8 -*-

# require ''
exit if Object.const_defined?(:Ocra)

print "Hello World!"
sleep 3

__END__

しかし、Ocraを使用しようとすると、エラーがスローされます。

ocra "TestScript.rb"

=== Loading script to check dependencies
=== Detected gem ocra-1.3.3 (loaded, files)
===     6 files, 190931 bytes
=== Detected gem io-console-0.4.2 (loaded, files)
C:/Program Files/Ruby/lib/ruby/gems/2.1.0/gems/ocra-1.3.3/bin/ocra:86:in `open':
 No such file or directory @ dir_initialize - C:/Program Files/Ruby/lib/ruby/gem
s/2.1.0/gems/io-console-0.4.2 (Errno::ENOENT)
        from C:/Program Files/Ruby/lib/ruby/gems/2.1.0/gems/ocra-1.3.3/bin/ocra:
86:in `entries'
        from C:/Program Files/Ruby/lib/ruby/gems/2.1.0/gems/ocra-1.3.3/bin/ocra:
86:in `entries'
        from C:/Program Files/Ruby/lib/ruby/gems/2.1.0/gems/ocra-1.3.3/bin/ocra:
92:in `find_all_files'
        from C:/Program Files/Ruby/lib/ruby/gems/2.1.0/gems/ocra-1.3.3/bin/ocra:
665:in `block (2 levels) in find_gem_files'
        from C:/Program Files/Ruby/lib/ruby/gems/2.1.0/gems/ocra-1.3.3/bin/ocra:
658:in `each'
        from C:/Program Files/Ruby/lib/ruby/gems/2.1.0/gems/ocra-1.3.3/bin/ocra:
658:in `block in find_gem_files'
        from C:/Program Files/Ruby/lib/ruby/gems/2.1.0/gems/ocra-1.3.3/bin/ocra:
611:in `each'
        from C:/Program Files/Ruby/lib/ruby/gems/2.1.0/gems/ocra-1.3.3/bin/ocra:
611:in `find_gem_files'
        from C:/Program Files/Ruby/lib/ruby/gems/2.1.0/gems/ocra-1.3.3/bin/ocra:
728:in `build_exe'
        from C:/Program Files/Ruby/lib/ruby/gems/2.1.0/gems/ocra-1.3.3/bin/ocra:
1165:in `block in <top (required)>'

質問

なぜこれが起こるのですか?修正方法は?

4

2 に答える 2

3

この問題は、irb 依存パッケージではなく、irb1.8 のインストールに起因します。問題を解決するには、irbl.8 が既にインストールされている場合は、「apt-get install irb」を実行します。

于 2015-01-01T09:38:31.937 に答える
2

tl;dr: Ruby バージョン 2.0.0p481 および ruby​​gems 2.0.14 で Ocra を使用して、スクリプトから実行可能ファイルを正常にビルドできました。Ruby のバージョンを切り替えることができれば、同じ結果が得られるはずです。(これは、素晴らしい uru を使用して、Windows で複数の Ruby バージョンを使用することについて私が行った記事です。)

より深いダイビング:

このio-console問題は Ocra gem の多くのユーザーを悩ませており、現在 github で未解決の問題があります。

https://github.com/larsch/ocra/issues/77

Ocra はGem::Specification#gem_dir、スクリプトに読み込まれたすべての gem を呼び出します。これにはio-console. その操作は存在しないパスを返すため、エラーが発生します。

(参考までに、rubygems のgem_dirメソッドへのリンクもあります。)

自分で試すことができます:

irb(main):001:0>require "io/console"
=> true
irb(main):002:0>io_console_spec = Gem.loaded_specs["io-console"]
=> #<Gem::Specification:0xblahblah io-console-0.4.2>
irb(main):003:0>proposed_path = io_console_spec.gem_dir
=> "$YOUR_RUBY_DIRECTORY/lib/ruby/gems/2.1.0/gems/io-console-0.4.2"
irb(main):004:0>File.directory? proposed_path
=> false

Ruby 2.0.0p481 を使用している場合、Ocra はこのスクリプトから実行可能ファイルを正常に作成しました。

ocra-成功

Gem.loaded_specsこれは、rubygems 2.0.14 (私の 2.0.0p481 ビルドで実行されているバージョン) と ruby​​gems 2.2.2 (私の 2.1.5 ビルドで実行されているバージョン) の間のどこかで結果が変わったと私に信じさせます。なぜGem::Specification#gem_dirなのかio-consoleを突き止めることは、私がさらに取り組んでいるものです (私は Ocra と Rubygems の内部構造に非常に慣れていません) が、これが役に立てば幸いです。

于 2015-01-12T16:31:39.110 に答える