如何通过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()获取当前目录。