2009-06-25 2 views
11

"require File.dirname(__ FILE__)" - ファイルシステムの依存関係を安全に元に戻す方法は?

私が使用しているRubyライブラリは、次のような require文を使用しています:

require File.dirname(__FILE__) + '/specification_helper.rb' 

lib_dir = File.expand_path(File.join(File.dirname(__FILE__), "lib")) 

require File.join(File.dirname(__FILE__), 'lib/tools', 'version') 

require File.expand_path(File.join(File.dirname(__FILE__), 'datautils', 'conn')) 

このフォーマットでは、ファイルシステムの構造に不必要にコードが変わることはありませんか?

著者はなぜこのようにしましたか?

このコードを(安全に)変更してファイルシステムに対するこの依存関係を取り除くことは可能でしょうか?

+0

codemeta.source_pdir http://en.wikibooks.org/wiki/AnyLang_Programming_Language_Comparison/Anylang_Common_Conceptsも参照 – dreftymac

答えて

10

私は実際に使用生産コードでこのスキーム。電流源位置に対してファイルを要求

はいくつかの利点を有する:

  • ソースツリー全体としての周りに移動することができ、我々は相対的に源を必要とするので、使用可能なままです。
  • 我々は完全なパスを使用するので、私たちは、コードがルビーの検索パス
を変更することなく使用することができ、偶発的衝突(別のライブラリに同じ名前のソースをロードするか、二度同じソースをリロード)
  • を避けます

    変更したルビーの検索パスを使用することを好むなら、あなたは複数の方法でそれを行うことができます。

    1. はルビーコマンドライン
    2. に-Iオプションを追加環境変数RUBYLIB

    ソリューション1で遊んソース

  • 内の$ LOAD_PATH変数を変更
  • はルビーが呼び出される方法を制御する意味します。

    @echo off 
    REM my_script.cmd 
    set srcdir=%~dp0\..\path\to\source 
    ruby -I %srcdir% %srcdir%\my_script.rb 
    

    または::

    #!/bin/sh 
    srcdir=$(cd $(dirname $0)/../path/to/source && pwd) 
    exec ruby -I $srcdir $srcdir/my_script.rb 
    

    ソリューション2が実行可能であるが、衝突を回避していないあなたのような、プログラムを起動するためのスクリプトが必要になります。 3はunadvisable、あなたは環境変数に向かっています以下の依存関係が、より良いあなたがされますされ

    $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) 
    

    ソリューション:あなたは、通常のようなものをやります。

  • 関連する問題