我如何获得Node.js中脚本的路径?
我知道有process.cwd,但这只是指调用脚本的目录,而不是脚本本身.例如,假设我在/home/kyle/,我运行以下命令:
node /home/kyle/some/dir/file.js
Run Code Online (Sandbox Code Playgroud)
如果我打电话process.cwd(),我会/home/kyle/,而不是/home/kyle/some/dir/.有办法获得该目录吗?
Kyl*_*ery 1321
我再次查看了文档后找到了它.我正在寻找的是__filename和__dirname模块级变量.
__filename是当前模块的文件名.这是当前模块文件的已解析绝对路径.(例如:/home/kyle/some/dir/file.js)__dirname是当前模块的目录名称.(例如:/home/kyle/some/dir)Mar*_*arc 236
所以基本上你可以这样做:
fs.readFile(path.resolve(__dirname, 'settings.json'), 'UTF-8', callback);
Run Code Online (Sandbox Code Playgroud)
使用resolve()而不是与'/'或'\'连接,否则您将遇到跨平台问题.
注意:__ dirname是模块或包含脚本的本地路径.如果您正在编写一个需要知道主脚本路径的插件,那么:
require.main.filename
Run Code Online (Sandbox Code Playgroud)
或者,只是获取文件夹名称:
require('path').dirname(require.main.filename)
Run Code Online (Sandbox Code Playgroud)
Mas*_*ali 101
此命令返回当前目录:
var currentPath = process.cwd();
Run Code Online (Sandbox Code Playgroud)
例如,要使用路径来读取文件:
var fs = require('fs');
fs.readFile(process.cwd() + "\\text.txt", function(err, data)
{
if(err)
console.log(err)
else
console.log(data.toString());
});
Run Code Online (Sandbox Code Playgroud)
Aza*_*rus 84
使用__dirname !!
__dirname
Run Code Online (Sandbox Code Playgroud)
当前模块的目录名称.这与path.dirname()相同__filename.
示例:从/ Users/mjr运行节点example.js
console.log(__dirname);
// Prints: /Users/mjr
console.log(path.dirname(__filename));
// Prints: /Users/mjr
Run Code Online (Sandbox Code Playgroud)
https://nodejs.org/api/modules.html#modules_dirname
Luk*_*tor 47
说到主脚本,它很简单:
process.argv[1]
Run Code Online (Sandbox Code Playgroud)
process.argv
包含命令行参数的数组.第一个元素是'node',第二个元素是JavaScript文件的路径.下一个元素将是任何其他命令行参数.
如果您需要知道模块文件的路径,请使用__filename.
小智 28
var settings =
JSON.parse(
require('fs').readFileSync(
require('path').resolve(
__dirname,
'settings.json'),
'utf8'));
Run Code Online (Sandbox Code Playgroud)
Haz*_*yan 24
每个Node.js程序在其环境中都有一些全局变量,它代表了有关您的进程的一些信息,其中之一就是__dirname.
GOT*_*O 0 24
Node.js 10支持ECMAScript模块,其中__dirname和__filename开箱即用.
然后,要获得当前ES模块的路径,必须使用:
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
Run Code Online (Sandbox Code Playgroud)
对于包含当前模块的目录:
import { dirname } from 'path';
import { fileURLToPath } from 'url';
const __dirname = dirname(fileURLToPath(import.meta.url));
Run Code Online (Sandbox Code Playgroud)
小智 14
NodeJS 公开了一个名为 的全局变量__dirname。
__dirname返回 JavaScript 文件所在文件夹的完整路径。
因此,以 Windows 为例,如果我们创建一个包含以下行的脚本文件:
console.log(__dirname);
Run Code Online (Sandbox Code Playgroud)
并使用以下命令运行该脚本:
node ./innerFolder1/innerFolder2/innerFolder3/index.js
Run Code Online (Sandbox Code Playgroud)
输出将为: C:\Users...<项目目录>\innerFolder1\innerFolder2\innerFolder3
Dan*_*ris 12
我知道这是相当陈旧的,我回答的原始问题被标记为重复并指示在这里,但我遇到了一个问题,试图让茉莉花 - 记者工作,并且不喜欢我不得不降级的想法为了它的工作.我发现jasmine-reporter没有正确解析savePath,实际上是将报告文件夹输出放在jasmine-reporter目录而不是我运行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
});
Run Code Online (Sandbox Code Playgroud)
您可以使用process.env.PWD获取当前的应用程序文件夹路径.
如果您pkg用于打包应用程序,则该表达式会很有用:
appDirectory = require('path').dirname(process.pkg ? process.execPath : (require.main ? require.main.filename : process.argv[0]));
Run Code Online (Sandbox Code Playgroud)
process.pkg告诉应用程序是否已被打包pkg。
process.execPath保留可执行文件的完整路径,/usr/bin/node对于直接调用脚本(node test.js)或打包的应用程序,该路径是相似的。
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()获取当前目录。
使用模块的basename方法path:
var path = require('path');
var filename = path.basename(__filename);
console.log(filename);
Run Code Online (Sandbox Code Playgroud)
这是上述示例取自的文档。
正如 Dan 所指出的,Node 正在开发带有“--experimental-modules”标志的ECMAScript 模块。Node 12 仍然支持__dirname和__filename如上。
如果您正在使用该--experimental-modules标志,则有另一种方法。
const __filename = new URL(import.meta.url).pathname;
Run Code Online (Sandbox Code Playgroud)
对于包含当前模块的目录:
import path from 'path';
const __dirname = path.dirname(new URL(import.meta.url).pathname);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
694523 次 |
| 最近记录: |