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

x8goxv8g  于 2022-09-21  发布在  Node.js
关注(0)|答案(13)|浏览(449)

我如何获得Node.js中脚本的路径?

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

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

如果我调用process.cwd(),我会得到/home/kyle/,而不是/home/kyle/some/dir/。有没有办法拿到那个目录?

fkvaft9z

fkvaft9z1#

我又看了一遍文档后发现的。我正在寻找的是__filename__dirname模块级别变量。

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

2j4z5cfb2#

所以基本上你可以这样做:

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

使用Resolve()而不是用‘/’或‘\’连接,否则会遇到跨平台问题。

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

require.main.filename

或者,仅获取文件夹名称:

require('path').dirname(require.main.filename)
u3r8eeie

u3r8eeie3#

使用__目录名!!

__dirname

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

示例:运行/USERS/mjr中的节点Example.js

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

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

对于ES模块,您可能希望使用:import.meta.url

ndh0cuux

ndh0cuux4#

此命令返回当前目录:

var currentPath = process.cwd();

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

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

rxztt3cl5#

Node.js 10支持ECMAScript modules,其中__dirname and __filename are no longer available

然后,要获得path to the current ES module,必须使用:

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));
nnt7mjpx

nnt7mjpx6#

当谈到主脚本时,它就像下面这样简单:

process.argv[1]

从Node.js文档:

Process.argv

包含命令行参数的数组。第一个元素将是‘node’,第二个元素将是指向JavaScript文件的路径。接下来的元素将是任何其他命令行参数。

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

uurv41yg

uurv41yg7#

var settings = 
    JSON.parse(
        require('fs').readFileSync(
            require('path').resolve(
                __dirname, 
                'settings.json'),
            'utf8'));
l5tcr1uw

l5tcr1uw8#

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

xzabzqsa

xzabzqsa9#

我知道这很古老,我最初回答的问题被标记为重复,并直接指向这里,但我遇到了一个问题,试图让茉莉花记者工作,我不喜欢我必须降级才能工作的想法。我发现Jasmine-Reports没有正确解析savePath,实际上是将Reports文件夹输出放在了jasmine-Reports目录中,而不是我运行GULP的根目录中。为了使其正常工作,我最终使用process.env.INIT_CWD获得了初始的当前工作目录,该目录应该是您运行GULP的目录。希望这能帮到什么人。

var reporters = require('jasmine-reporters');
var junitReporter = new reporters.JUnitXmlReporter({
  savePath: process.env.INIT_CWD + '/report/e2e/',
  consolidateAll: true,
  captureStdout: true
 });
fzsnzjdm

fzsnzjdm10#

您可以使用Process.env.PWD来获取当前的应用程序文件夹路径。

2ekbmq32

2ekbmq3211#

如果你使用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保存Current脚本的完整路径,所以我没有使用它(尽管它可能是OP要求的;那么最好使用appDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0]));,注意在交互模式下__dirname是空的。
  • 对于交互模式,使用process.argv[0]获取节点可执行文件的路径,或使用process.cwd()获取当前目录。
c9x0cxw0

c9x0cxw012#

使用path模块的basename方法:

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

以下是摘自上述示例的文档。

正如Dan所指出的那样,Node正在使用“--实验性模块”标志处理ECMAScript modules。节点12仍然支持如上所述的__dirname__filename

如果您使用的是--experimental-modules标志,则存在alternative approach

另一种方法是获取path to the current ES module

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)));
t8e9dugd

t8e9dugd13#

NodeJS公开了一个名为**__dirname**的全局变量。

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

因此,作为一个示例,对于Windows,如果我们创建一个包含以下行的脚本文件:

console.log(__dirname);

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

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

输出将为:C:\Users...\innerFolder1\innerFolder2\innerFolder3

相关问题