27

Rubyプログラムで必要なパスを管理する最良の方法は何ですか?

基本的な例を挙げましょう。次のような構造を考えてみましょう。

\MyProgram

\MyProgram\src\myclass.rb

\MyProgram\test\mytest.rb

私のテストで使用する場合、フォルダーrequire '../src/myclass'からのみテスト\MyProgram\testを呼び出すことができますが、任意のパスから呼び出すことができるようにしたいです!

私が思いついた解決策は、すべてのソース ファイルで次の行を定義することです。

ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(ROOT)そして、常に使用しますrequire "#{ROOT}/src/myclass"

それを行うより良い方法はありますか?

4

7 に答える 7

32

Ruby 1.9以降、 require_relativeを使用してこれを行うことができます。

require_relative '../src/myclass'

以前のバージョンでこれが必要な場合は、このSOコメントに従って拡張機能gemから取得できます。

于 2010-09-10T13:31:07.803 に答える
12

これを行うためのわずかに変更された方法を次に示します。

$LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), "..", "src"))

ソースへのパスを $LOAD_PATH (別名 $:) に追加することで、コードが必要なときにルートなどを明示的に指定する必要がなくなります。 require 'myclass'

于 2009-05-26T11:32:20.823 に答える
9

同じ、ノイズの少ない私見:

$:.unshift File.expand_path("../../src", __FILE__)
require 'myclass'

あるいは単に

require File.expand_path "../../src/myclass", __FILE__

(Debian) Linux 上の ruby​​ 1.8.7 および 1.9.0 でテスト済み - Windows でも動作するかどうか教えてください。

より単純なメソッド (たとえば、「use」、「require_relative」、またはこのような sg) が標準ライブラリに組み込まれていないのはなぜですか? 更新: 1.9.x 以降、require_relative があります

于 2009-11-07T02:38:04.627 に答える
2
Pathname(__FILE__).dirname.realpath

動的な方法で絶対パスを提供します。

于 2010-12-01T14:57:49.070 に答える
2

次のコードを使用して、特定のフォルダー (=> Ruby 1.9) 内のすべての「rb」ファイルを要求します。

path='../specific_folder/' # relative path from current file to required folder

Dir[File.dirname(__FILE__) + '/'+path+'*.rb'].each do |file|
  require_relative path+File.basename(file) # require all files with .rb extension in this folder
end
于 2011-01-03T17:02:56.733 に答える
1

srisの答えは標準的なアプローチです。

もう 1 つの方法は、コードを gem としてパッケージ化することです。その後、rubygems は、ライブラリ ファイルがパスにあることを確認します。

于 2009-05-26T11:38:22.933 に答える
0

これが私が最終的に得たものです-setenvシェルスクリプトのRubyバージョン:

  # Read application config                                                       
$hConf, $fConf = {}, File.expand_path("../config.rb", __FILE__)
$hConf = File.open($fConf) {|f| eval(f.read)} if File.exist? $fConf

  # Application classpath                                                         
$: << ($hConf[:appRoot] || File.expand_path("../bin/app", __FILE__))

  # Ruby libs                                                                     
$lib = ($hConf[:rubyLib] || File.expand_path("../bin/lib", __FILE__))
($: << [$lib]).flatten! # lib is string or array, standardize                     

次に、このスクリプトが何よりも先に 1 回呼び出されることを確認する必要があり、個々のソース ファイルに触れる必要はありません。

外部(非gem)ライブラリの場所など、いくつかのオプションを設定ファイル内に入れました:

# Site- and server specific config - location of DB, tmp files etc.
{
  :webRoot => "/srv/www/myapp/data",
  :rubyLib => "/somewhere/lib",
  :tmpDir => "/tmp/myapp"
}

これは私にとってはうまく機能しており、設定ファイルのパラメーターを変更するだけで、複数のプロジェクトで setenv スクリプトを再利用できます。シェル スクリプト、IMO よりもはるかに優れた代替手段です。

于 2009-11-12T12:11:12.990 に答える