1

私は最初のRubyプロジェクトに取り組んでおり、ファイルを別のディレクトリに整理しようとしているときに、.rbファイルにRuby以外のファイル(.txtファイルなど)をローカルにロードさせる際に問題が発生しました。 。

たとえば、プロジェクトの構造が次のようになっているとします。

myproject/
    bin/
        runner.rb
    lib/
        foo.rb
        fooinfo.txt
    test/
        testfoo.rb

また、ファイルの内容は次のとおりです。

runner.rb

require_relative '../lib/foo.rb'

foo.rb

File.open('./fooinfo.txt') do |file|
    while line = file.gets
        puts line
    end
end

libにcdしてfoo.rbを実行すると、独自のディレクトリでfooinfo.txtを見つけて、その内容を出力するのに問題はありません。ただし、binにcdしてrunner.rbを実行すると、次のようになります。

in `initialize': No such file or directory - ./fooinfo.txt (Errno::ENOENT)

これは、File.openが、最上位プログラムが実行されているディレクトリを基準にして検索するためだと思います。foo.rbが実行/要求される場所に関係なくfooinfo.rbを確実に見つける方法はありますか(foo.rbとfooinfo.rbが常に相互に同じ場所を維持していると仮定します)?bin / runner.rbからfoo.rbを実行し、test /にテストファイルを実行して、どちらの場合もfooinfo.txtを見つけられるようにしたいと思います。

理想的には、myprojectディレクトリ全体が移動された場合でも機能するソリューションが必要です。

非rubyファイルを見つけることができるrequire_relativeのようなものはありますか?

4

2 に答える 2

2

__FILE__とを使用しFile.dirnameて絶対パスを作成してみてください。例えば:

File.open(File.expand_path(File.dirname(__FILE__)) + './fooinfo.txt') do |file|
   ...
end
于 2012-07-12T21:04:54.343 に答える
0

この場合、最も簡単なのは変更することです

File.open('./fooinfo.txt')

File.open('../lib/fooinfo.txt')

これは、プロジェクトルート(を含む)のすぐ下にある任意のプロジェクトサブディレクトリから機能しますlib/

大規模なプロジェクトで役立つ、より堅牢なソリューションは、PROJECT_ROOTどこからでも使用できる定数を用意することです。あなたが持っている場合lib/const.rb

module Const
  PROJECT_ROOT = File.expand_path("..", File.dirname(__FILE__))
end

次に(そのファイルを編集したと仮定してrequire)次を使用できます。

File.open(Const::PROJECT_ROOT + '/lib/fooinfo.txt')
于 2012-07-12T23:21:57.857 に答える