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
require 时的当前路径如何,都会成功,并且 fs.open 将失败(除非$PATH
is dirC
)
有什么办法可以让fs.open()
行为表现得像require()
?
我在想类似的事情,fs.open( phantomjs.getScriptPath() + '../dirC2/open_me.js' );
但我的 searchfoo 没有找到任何东西来填充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' );