我如何获得Node.js中脚本的路径?
我知道有process.cwd,但这只是指脚本被调用的目录,而不是脚本本身。例如,假设我在/home/kyle/中,并运行以下命令:
process.cwd
/home/kyle/
node /home/kyle/some/dir/file.js
如果我调用process.cwd(),我会得到/home/kyle/,而不是/home/kyle/some/dir/。有没有办法拿到那个目录?
process.cwd()
/home/kyle/some/dir/
fkvaft9z1#
我又看了一遍文档后发现的。我正在寻找的是__filename和__dirname模块级别变量。
__filename
__dirname
/home/kyle/some/dir/file.js
/home/kyle/some/dir
2j4z5cfb2#
所以基本上你可以这样做:
fs.readFile(path.resolve(__dirname, 'settings.json'), 'UTF-8', callback);
使用Resolve()而不是用‘/’或‘\’连接,否则会遇到跨平台问题。
注意:__dirname是模块或包含的脚本的本地路径。如果您正在编写一个需要知道主脚本路径的插件,它是:
require.main.filename
或者,仅获取文件夹名称:
require('path').dirname(require.main.filename)
u3r8eeie3#
使用__目录名!!
当前模块的目录名。这与__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
import.meta.url
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()); });
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));
nnt7mjpx6#
当谈到主脚本时,它就像下面这样简单:
process.argv[1]
从Node.js文档:
包含命令行参数的数组。第一个元素将是‘node’,第二个元素将是指向JavaScript文件的路径。接下来的元素将是任何其他命令行参数。
如果您需要知道模块文件的路径,则使用__filename。
uurv41yg7#
var settings = JSON.parse( require('fs').readFileSync( require('path').resolve( __dirname, 'settings.json'), 'utf8'));
l5tcr1uw8#
每个Node.js程序的环境中都有一些全局变量,它们表示有关您的进程的一些信息,其中一个是__dirname。
xzabzqsa9#
我知道这很古老,我最初回答的问题被标记为重复,并直接指向这里,但我遇到了一个问题,试图让茉莉花记者工作,我不喜欢我必须降级才能工作的想法。我发现Jasmine-Reports没有正确解析savePath,实际上是将Reports文件夹输出放在了jasmine-Reports目录中,而不是我运行GULP的根目录中。为了使其正常工作,我最终使用process.env.INIT_CWD获得了初始的当前工作目录,该目录应该是您运行GULP的目录。希望这能帮到什么人。
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 });
fzsnzjdm10#
您可以使用Process.env.PWD来获取当前的应用程序文件夹路径。
2ekbmq3211#
如果你使用pkg打包你的应用程序,你会发现这个表达式很有用:
pkg
appDirectory = require('path').dirname(process.pkg ? process.execPath : (require.main ? require.main.filename : process.argv[0]));
process.pkg
process.execPath
node test.js
/usr/bin/node
appDirectory = process.pkg ? require('path').dirname(process.execPath) : (__dirname || require('path').dirname(process.argv[0]));
process.argv[0]
c9x0cxw012#
使用path模块的basename方法:
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。
--experimental-modules
另一种方法是获取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)));
t8e9dugd13#
NodeJS公开了一个名为**__dirname**的全局变量。
__dirname返回JAVASCRIPT文件所在文件夹的完整路径。
因此,作为一个示例,对于Windows,如果我们创建一个包含以下行的脚本文件:
console.log(__dirname);
并使用以下命令运行该脚本:
node ./innerFolder1/innerFolder2/innerFolder3/index.js
输出将为:C:\Users...\innerFolder1\innerFolder2\innerFolder3
13条答案
按热度按时间fkvaft9z1#
我又看了一遍文档后发现的。我正在寻找的是
__filename
和__dirname
模块级别变量。__filename
是当前模块的文件名。这是当前模块文件的解析绝对路径。(例如:/home/kyle/some/dir/file.js
)__dirname
是当前模块的目录名。(例如:/home/kyle/some/dir
)2j4z5cfb2#
所以基本上你可以这样做:
使用Resolve()而不是用‘/’或‘\’连接,否则会遇到跨平台问题。
注意:__dirname是模块或包含的脚本的本地路径。如果您正在编写一个需要知道主脚本路径的插件,它是:
或者,仅获取文件夹名称:
u3r8eeie3#
使用__目录名!!
当前模块的目录名。这与
__filename
的路径.dirname()相同。示例:运行/USERS/mjr中的节点Example.js
Https://nodejs.org/api/modules.html#modules_dirname
对于ES模块,您可能希望使用:
import.meta.url
ndh0cuux4#
此命令返回当前目录:
例如,要使用路径读取文件:
rxztt3cl5#
Node.js 10支持ECMAScript modules,其中
__dirname
and__filename
are no longer available。然后,要获得path to the current ES module,必须使用:
对于包含当前模块的目录:
nnt7mjpx6#
当谈到主脚本时,它就像下面这样简单:
从Node.js文档:
Process.argv
包含命令行参数的数组。第一个元素将是‘node’,第二个元素将是指向JavaScript文件的路径。接下来的元素将是任何其他命令行参数。
如果您需要知道模块文件的路径,则使用__filename。
uurv41yg7#
l5tcr1uw8#
每个Node.js程序的环境中都有一些全局变量,它们表示有关您的进程的一些信息,其中一个是
__dirname
。xzabzqsa9#
我知道这很古老,我最初回答的问题被标记为重复,并直接指向这里,但我遇到了一个问题,试图让茉莉花记者工作,我不喜欢我必须降级才能工作的想法。我发现Jasmine-Reports没有正确解析
savePath
,实际上是将Reports文件夹输出放在了jasmine-Reports目录中,而不是我运行GULP的根目录中。为了使其正常工作,我最终使用process.env.INIT_CWD
获得了初始的当前工作目录,该目录应该是您运行GULP的目录。希望这能帮到什么人。fzsnzjdm10#
您可以使用Process.env.PWD来获取当前的应用程序文件夹路径。
2ekbmq3211#
如果你使用
pkg
打包你的应用程序,你会发现这个表达式很有用: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()
获取当前目录。c9x0cxw012#
使用
path
模块的basename
方法:以下是摘自上述示例的文档。
正如Dan所指出的那样,Node正在使用“--实验性模块”标志处理ECMAScript modules。节点12仍然支持如上所述的
__dirname
和__filename
。如果您使用的是
--experimental-modules
标志,则存在alternative approach。另一种方法是获取path to the current ES module:
对于包含当前模块的目录:
t8e9dugd13#
NodeJS公开了一个名为**
__dirname
**的全局变量。__dirname
返回JAVASCRIPT文件所在文件夹的完整路径。因此,作为一个示例,对于Windows,如果我们创建一个包含以下行的脚本文件:
并使用以下命令运行该脚本:
输出将为:C:\Users...\innerFolder1\innerFolder2\innerFolder3