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

问题源于安装 irb1.8 而不是 irb 依赖包。如果您已经安装了 irbl.8,只需执行“apt-get install irb”即可解决问题。

于 2015-01-01T09:38:31.937 回答
2

tl;dr:我能够使用 Ocra 和 Ruby 版本 2.0.0p481 和 ruby​​gems 2.0.14 从您的脚本成功构建可执行文件。如果您可以切换 Ruby 版本,您应该能够获得相同的结果。(这是我写的一篇关于在 Windows 上使用多个 Ruby 版本和很棒的 uru 的文章。)

更深的潜水:

这个io-console问题困扰了很多 Ocra gem 的用户,目前在 github 上有一个未解决的问题:

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

Ocra 调用Gem::Specification#gem_dir脚本中所有已加载的 gem,其中包括io-console. 该操作返回一个不存在的路径,因此出现错误。

(这里也是 ruby​​gems 的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 成功地从此脚本创建了一个可执行文件:

奥克拉成功

这让我相信Gem.loaded_specsruby​​gems 2.0.14(这是在我的 2.0.0p481 版本上运行的版本)和 ruby​​gems 2.2.2(这是在我的 2.1.5 版本上运行的版本)之间的某个地方的结果发生了变化。深入了解为什么Gem::Specification#gem_dirio-console我将要做的更多工作(我对 Ocra 和 Rubygems 的内部工作非常陌生),但希望这会有所帮助。

于 2015-01-12T16:31:39.110 回答