如何通过Node.js获取当前脚本的path?
我将如何获得Node.js中脚本的path?
我知道有process.cwd
,但是这只是指脚本被调用的目录,而不是脚本本身。 例如,说我在/home/kyle/
并运行以下命令:
node /home/kyle/some/dir/file.js
如果我打电话给process.cwd()
,我得到/home/kyle/
,而不是/home/kyle/some/dir/
。 有没有办法获得该目录?
我再次查看文档后发现它。 我正在寻找的是__filename
和__dirname
模块级variables。
所以基本上你可以这样做:
fs.readFile(path.resolve(__dirname, 'settings.json'), 'UTF-8', callback);
使用resolve()而不是连接“/”或“\”,否则会遇到跨平台问题。
注意:__dirname是模块或包含脚本的本地path。 如果你正在编写一个需要知道主脚本path的插件,那就是:
require.main.filename
或者,只需要获取文件夹名称:
require('path').dirname(require.main.filename)
var settings = JSON.parse( require('fs').readFileSync( require('path').resolve( __dirname, 'settings.json'), 'utf8'));
当涉及到主脚本时,它就像下面这样简单:
process.argv[1]
从Node.js文档 :
process.argv
包含命令行参数的数组。 第一个元素是'node', 第二个元素是JavaScript文件的名字 。 下一个元素将是任何额外的命令行参数。
如果您需要知道模块文件的path,请使用__filename 。
这个命令返回当前目录:
var path = process.cwd();
例如,要使用path来读取文件:
var fs = require('fs'); fs.readFile(process.cwd() + "\\text.txt", function(err, data) { if(err) console.log(err) else console.log(data.toString()); });
每个Node.js程序在其环境中都有一些全局variables,它代表了一些有关进程的信息,其中一个是__dirname
。
您可以使用process.env.PWD获取当前的应用程序文件夹path。
我知道这已经很老了,原来我回应的问题被标记为重复,并指向这里,但我碰到一个问题,试图让茉莉花记者工作,不喜欢这个想法,我不得不降级为了它的工作。 我发现茉莉花记者没有正确parsingsavePath,实际上是把报告文件夹的输出放在jasmine-reporter目录里,而不是我跑的那个根目录。 为了使这个工作正常,我结束了使用process.env.INIT_CWD来获得最初的当前工作目录,这应该是你跑的一个目录。 希望这有助于某人。
var reporters = require('jasmine-reporters'); var junitReporter = new reporters.JUnitXmlReporter({ savePath: process.env.INIT_CWD + '/report/e2e/', consolidateAll: true, captureStdout: true });
如果你想在shell脚本中更像$ 0的东西,试试这个:
var path = require('path'); var command = getCurrentScriptPath(); console.log(`Usage: ${command} <foo> <bar>`); function getCurrentScriptPath () { // Relative path from current working directory to the location of this script var pathToScript = path.relative(process.cwd(), __filename); // Check if current working dir is the same as the script if (process.cwd() === __dirname) { // Eg "./foobar.js" return '.' + path.sep + pathToScript; } else { // Eg "foo/bar/baz.js" return pathToScript; } }
如果你使用pkg
打包你的应用程序,你会发现有用的这个expression式:
appDirectory = require('path').dirname(process.pkg ? process.execPath : (require.main ? require.main.filename : process.argv[0]));
-
process.pkg
告诉应用程序是否已被pkg
打包。 -
process.execPath
保存可执行文件的完整path,即直接调用脚本(node test.js
)或打包的应用程序的/usr/bin/node
或类似文件。 -
require.main.filename
保存主脚本的完整path,但当Node以交互模式运行时,它是空的。 -
__dirname
保存当前脚本的完整path,所以我没有使用它(尽pipe它可能是OP所要求的;然后更好地使用appDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0]));
注意在交互模式下__dirname
是空的。 -
对于交互模式,请使用
process.argv[0]
获取Node可执行文件的path,或使用process.cwd()
获取当前目录。