phantomjs:如何使fs.open的行为与require相同,对于路径

时间:2013-02-22 18:32:20

标签: phantomjs

require()基于脚本路径工作。 fs.open()适用于调用(当前shell)路径。

假设我有树:

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时的当前路径是什么,但必须成功,而fs.open将失败(除非$PATHdirC

有没有办法让fs.open()表现为require()

我在想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' );

0 个答案:

没有答案