0

私はRuby/JRubyを初めて使用し、特定のプロジェクトのRubyソースコードを直接実行しようとすると、「LoadError: no such file to load」というエラーに何週間も悩まされてきました。

多くの Ruby プロジェクトのソース コードを GitHub からダウンロードしました。はい、ソースコードのみです。私のタスクはコード自体の分析に重点が置かれているため、インストールしませんでした。

プロジェクト「rqrcode」が次の(簡略化された)構造を持っているとします。

  • rqrコード
    • lib(フォルダ)
      • rqrcode (フォルダー)
        • core_ext (フォルダー、内部にいくつかのファイル)
        • core_ext.rb
        • qrcode (フォルダ、内部にいくつかのファイル)
        • qrcode.rb
      • rqrcode.rb
    • テスト (フォルダー)
      • data.rb
      • test_rqrcode.rb

したがって、テスト フォルダー内で「jruby test_rqrcode.rb」を実行すると、ファイル内の次の行で LoadError がスローされます。

require_relative "../lib/rqrcode"

また、lib フォルダー内の rqrcode.rb ファイルで LoadError がスローされます。

require "rqrcode/core_ext"

エラーメッセージは

LoadError: no such file to load -- rqrcode/core_ext
require at org/jruby/RubyKernel.java:1054
require at /Users/x5lai/.rvm/rubies/jruby-1.7.4/lib/ruby/shared/rubygems/custom_require.rb:36
(root) at /Users/x5lai/Downloads/rqrcode-master/lib/rqrcode.rb:12
require at org/jruby/RubyKernel.java:1054
(root) at /Users/x5lai/.rvm/rubies/jruby-1.7.4/lib/ruby/shared/rubygems/custom_require.rb:1
require at /Users/x5lai/.rvm/rubies/jruby-1.7.4/lib/ruby/shared/rubygems/custom_require.rb:36
(root) at test_rqrcode.rb:12

「rqrcode/core_ext」が見つからないと言われる理由が本当にわかりません。なぜなら、そのフォルダーはそこに存在するからです!

このようなエラーは常に発生するとは限りません。上記と同様の構造を持つ他の Ruby プロジェクトのソース コードをダウンロードすると、すべての「require」、「require_relative」ステートメントで正常に実行されることがあります。

私の友人は、Ruby のデフォルトのロード パスの問題だと言っています。そのため、Ruby ロード パスの内部を調べてみました。多くのRubyファイルでいっぱいです。ただし、正常に実行される Ruby プロジェクトでは、これらのロード パスに Ruby ファイルもありません (また、コード内のロード パスを変更するために「.unshift」を使用しません)。ですから、これがプロジェクトの失敗の原因だとは思いません。

私の疑問を明確にしてくれる人がいることを願っています。私のJRuby設定が原因でしょうか?私はMacを使用しています。私のJRubyのバージョンは1.7.4です。

4

2 に答える 2

1

まず、Ruby のロード パスには現在のディレクトリが含まれていません。これは、cmd
で実行することで確認できます。jruby -e "$:"

第二に、あなたが で行うときrequire_relative "../lib/rqrcode"test_rqrcode.rbあなたは「自分自身からの相対パスでファイルを見つけてください」と言っています。わかりました、すぐに rqrcode.rb を見つけることができます。ただし、rqrcode.rb独自の必要なファイルがどこにあるかわからないため、グローバル ロード パスである$:. lib フォルダーが含まれていないため$:、lib フォルダー内に存在するファイルを見つけることができず、例外が返されます。

これを知った上で、ローカルの lib ディレクトリをメイン スクリプトのロード パスに追加して、後続のすべてのファイルが同じロード パス環境を使用するようにする必要があります。

$:.unshift "path_to_the_folder_need_to_include"

于 2013-11-05T01:06:19.650 に答える
0

コマンド ラインでは、スイッチ$LOAD_PATHを使用してフォルダーを に追加できます。-I例えば:

ruby -I lib test/test_qrcode.rb

ruby プロジェクトでは、通常はorという名前のファイル (フレームワークによって異なります) に、テスト セットアップでlibフォルダーを追加するのが一般的です。$LOAD_PATHtest_helper.rbspec_helper.rb

于 2013-11-04T21:52:51.260 に答える