如何使用Node.js?获取当前脚本的路径

如何在Node.js?中获取脚本的路径

我知道有process.cwd,但它仅指调用脚本的目录,而不是脚本本身。例如,假设我在/home/kyle/中,我运行以下命令:

node /home/kyle/some/dir/file.js

如果我调用process.cwd(),我得到/home/kyle/,而不是/home/kyle/some/dir/。有办法获取该目录吗?

1029248 次浏览

我在再次查看留档后找到了它。我正在寻找#0#1模块级变量。

  • __filename是当前模块的文件名。这是当前模块文件的解析绝对路径。(例如:/home/kyle/some/dir/file.js
  • __dirname是当前模块的目录名。(例如:/home/kyle/some/dir

基本上你可以这样做:

fs.readFile(path.resolve(__dirname, 'settings.json'), 'UTF-8', callback);

不要用'/'或'\'连接,否则你会遇到跨平台问题。

注意:__dirname是模块或包含脚本的本地路径。如果您正在编写需要知道主脚本路径的插件,则为:

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

包含命令行参数的数组。第一个元素将是“节点”,第二个元素将是JavaScript文件的路径。下一个元素将是任何额外的命令行参数。

如果您需要知道模块文件的路径,请使用__filename

每个Node.js程序在其环境中都有一些全局变量,这些变量表示有关进程的一些信息,其中一个是__dirname

可以使用process.env.PWD获取当前应用文件夹路径。

此命令返回当前目录:

var currentPath = process.cwd();

例如,要使用路径读取文件:

var fs = require('fs');fs.readFile(process.cwd() + "\\text.txt", function(err, data){if(err)console.log(err)elseconsole.log(data.toString());});

我知道这已经很老了,我回答的最初的问题被标记为重复并定向到这里,但是我在试图让茉莉花记者工作时遇到了一个问题,并且不喜欢为了让它工作而必须降级的想法。我发现茉莉花记者没有正确解析savePath,实际上是将报告文件夹输出放在茉莉花记者目录中,而不是我运行吞咽的根目录中。为了正确地完成这项工作,我最终使用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});

如果你想要更像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 scriptvar pathToScript = path.relative(process.cwd(), __filename);
// Check if current working dir is the same as the scriptif (process.cwd() === __dirname) {// E.g. "./foobar.js"return '.' + path.sep + pathToScript;} else {// E.g. "foo/bar/baz.js"return pathToScript;}}

如果你使用pkg打包你的应用程序,你会发现这个表达式很有用:

appDirectory = require('path').dirname(process.pkg ? process.execPath : (require.main ? require.main.filename : process.argv[0]));
  • process.pkg告诉应用程序是否已被pkg打包。

  • process.execPath保存可执行文件的完整路径,对于直接调用脚本(node test.js)或打包的应用程序,它与/usr/bin/node或类似。

  • require.main.filename保存主脚本的完整路径,但当Node在交互模式下运行时,它为空。

  • __dirname保存了当前脚本的完整路径,所以我没有使用它(尽管它可能是OP要求的;那么最好使用appDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0]));,注意在交互模式下__dirname是空的。

  • 对于交互模式,使用process.argv[0]获取Node可执行文件的路径或process.cwd()获取当前目录。

使用__dirname!

__dirname

当前模块的目录名。这与__filename的path.dirname()相同。

示例:从 /Users/mjr运行节点example.js

console.log(__dirname);// Prints: /Users/mjrconsole.log(path.dirname(__filename));// Prints: /Users/mjr

https://nodejs.org/api/modules.html#modules_dirname

对于你想要使用的ESModules:import.meta.url

Node.js10支持ECMAScript模块,其中#0和#1不再可用

然后要获得当前ES模块的路径,必须使用:

import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);

对于包含当前模块的目录:

import { dirname } from 'path';import { fileURLToPath } from 'url';
const __dirname = dirname(fileURLToPath(import.meta.url));

使用path模块的basename方法:

var path = require('path');var filename = path.basename(__filename);console.log(filename);

这里是上面例子的留档。

正如Dan所指出的,Node正在使用“——实验模块”标志处理ECMAScript模块。Node 12仍然是上面的支持#0和#1


如果您使用--experimental-modules标志,则存在替代方法

另一种方法是获取当前ES模块的路径

import { fileURLToPath } from 'url';const __filename = fileURLToPath(new URL(import.meta.url));

对于包含当前模块的目录:

import { fileURLToPath } from 'url';import path from 'path';
const __dirname = path.dirname(fileURLToPath(new URL(import.meta.url)));

index.js包含要导出的模块的任何文件夹中

const entries = {};for (const aFile of require('fs').readdirSync(__dirname, { withFileTypes: true }).filter(ent => ent.isFile() && ent.name !== 'index.js')) {const [ name, suffix ] = aFile.name.split('.');entries[name] = require(`./${aFile.name}`);}
module.exports = entries;

这将查找当前目录根目录中的所有文件,要求并导出与文件名词干具有相同导出名称的每个文件。

NodeJS公开了一个名为#0的全局变量。

__dirname返回JavaScript文件所在文件夹的完整路径。

因此,例如,对于Windows,如果我们使用以下行创建一个脚本文件:

console.log(__dirname);

并使用以下命令运行该脚本:

node ./innerFolder1/innerFolder2/innerFolder3/index.js

输出将是:C:\用户…<项目-目录>\内部文件夹1\内部文件夹2\内部文件夹3