Answers:
我在再次浏览文档后才找到它。我要寻找的是__filename
和__dirname
模块级别的变量。
__filename
是当前模块的文件名。这是当前模块文件的已解析绝对路径。(例如:/home/kyle/some/dir/file.js
)__dirname
是当前模块的目录名称。(例如:/home/kyle/some/dir
)__dirname.split(path.sep).pop()
require('path').basename(__dirname);
因此,基本上,您可以这样做:
fs.readFile(path.resolve(__dirname, 'settings.json'), 'UTF-8', callback);
使用resolve()而不是与“ /”或“ \”串联,否则会遇到跨平台问题。
注意:__dirname是模块或包含的脚本的本地路径。如果您要编写一个需要知道主脚本路径的插件,则为:
require.main.filename
或者,仅获取文件夹名称:
require('path').dirname(require.main.filename)
var settings = require('./settings.json')
。当然,它是同步fs IO,因此不要在运行时执行它,但是在启动时就可以了,一旦加载,就将被缓存。
此命令返回当前目录:
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());
});
cd /foo; node bar/test.js
,则当前目录为/foo
,但脚本位于/foo/bar/test.js
。
text.txt
并且可以工作,则无需构造绝对路径
使用__dirname!
__dirname
当前模块的目录名称。这与的path.dirname()相同__filename
。
示例:从/ 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
对于ESModule,您将要使用:
import.meta.url
当涉及到主脚本时,它很简单:
process.argv[1]
process.argv
包含命令行参数的数组。第一个元素是'node',第二个元素是JavaScript文件的路径。接下来的元素将是任何其他命令行参数。
如果您需要知道模块文件的路径,请使用__filename。
process.argv[1]
仅适用于主脚本,而__filename
指向正在执行的模块文件。我更新我的答案以强调差异。不过,我发现使用没错process.argv[1]
。取决于一个人的要求。
Node.js的10个支持ECMAScript的模块,其中__dirname
和__filename
不再可用。
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));
--experimental-modules
标志。
var settings =
JSON.parse(
require('fs').readFileSync(
require('path').resolve(
__dirname,
'settings.json'),
'utf8'));
__dirname
不再与ES模块一起使用。
每个Node.js程序在其环境中都有一些全局变量,这些变量表示有关您的过程的一些信息,其中一个是__dirname
。
__dirname
不再与ES模块一起使用。
我知道这已经很老了,我最初回答的问题被标记为重复并直接指向此处,但是我遇到了一个问题,试图让茉莉花记者正常工作,并且不喜欢我必须降级的想法。使其工作。我发现jasmine-reporters不能正确解析savePath,实际上是将reports文件夹输出放在jasmine-reporters目录中,而不是在我运行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
});
您可以使用process.env.PWD获取当前应用程序文件夹路径。
如果您pkg
用于打包应用程序,则该表达式会很有用:
appDirectory = require('path').dirname(process.pkg ? process.execPath : (require.main ? require.main.filename : process.argv[0]));
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);
这是上面示例的文档。
正如Dan所指出的那样,Node正在使用“ --experimental-modules”标志来处理ECMAScript模块。节点12仍支持__dirname
和__filename
。
如果您使用--experimental-modules
标志,则有另一种方法。
const __filename = new URL(import.meta.url).pathname;
对于包含当前模块的目录:
import path from 'path';
const __dirname = path.dirname(new URL(import.meta.url).pathname);
如果要在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) {
// E.g. "./foobar.js"
return '.' + path.sep + pathToScript;
} else {
// E.g. "foo/bar/baz.js"
return pathToScript;
}
}