1

require()スクリプト パスに基づいて動作します。fs.open()呼び出し (現在のシェル) パスで動作します。

私が木を持っているとしましょう:

dirA/
dirA/dirB/
dirA/dirB/dirC/
dirA/dirB/dirC/test.js
dirA/dirB/dirC2/include_me.js
dirA/dirB/dirC2/open_me.js

および の内容test.js:

var myMod = require('../dirC2/include_me.js');
var fs = require('fs');
fs.open('../dirC2/open_me.js')

現在のパスに関係なくphantomjs $PATH/test.js、require を実行すると成功し、fs.open は失敗します (そうでない場合$PATH) dirC

fs.open()のように動作させる方法はありますrequire()か?

私は次のようなことを考えていますが、私のsearchfooはそこに作成されたメソッドにfs.open( phantomjs.getScriptPath() + '../dirC2/open_me.js' ); 記入するものを見つけることができませんでした.getScriptPath


編集:答えが「いいえ」の場合に使用している回避策をここに投稿します。

/**
 * Opens a file relative to the script path.
 * this solves an inconsistency between require() and fs.open()
*/
exports.getScriptPath = function( newPath ){
    var script, scriptPath;
    script = exports.system.args[0];
    scriptPath = script.replace(/\/[^\/]+$/, '') // removes everything from 
    //                                              the last "/" until the end of
    //                                              the line, non-greedy
    return scriptPath + '/';
}

これは私が持っているユーティリティモジュールで使用されています。また、スクリプト (対話型の phantomjs セッションで上記のモジュールを使用するとうまく機能しません) と UNIX スタイルのパスを呼び出していることを前提としています。Windows を使用している場合は\、正規表現に追加するだけです。次に、次のように使用されます。

filehandle = exports.fs.open( exports.getScriptPath() + '../dirC2/open_me.js', 'r' );
4

0 に答える 0