如何使用Node.js获取当前脚本的路径?
如何获取Node.js中脚本的路径 我知道有如何使用Node.js获取当前脚本的路径?,node.js,Node.js,如何获取Node.js中脚本的路径 我知道有process.cwd,但它只指调用脚本的目录,而不是脚本本身。例如,假设我在/home/kyle/中,我运行以下命令: node /home/kyle/some/dir/file.js 如果调用process.cwd(),则得到的是/home/kyle/,而不是/home/kyle/some/dir/。有办法得到那个目录吗?我在再次查看文档后找到了它。我要找的是和模块级别的变量 \u filename是当前模块的文件名。这是当前模块文件的解析绝对
process.cwd
,但它只指调用脚本的目录,而不是脚本本身。例如,假设我在/home/kyle/
中,我运行以下命令:
node /home/kyle/some/dir/file.js
如果调用
process.cwd()
,则得到的是/home/kyle/
,而不是/home/kyle/some/dir/
。有办法得到那个目录吗?我在再次查看文档后找到了它。我要找的是和模块级别的变量
是当前模块的文件名。这是当前模块文件的解析绝对路径。(例如:\u filename
)/home/kyle/some/dir/file.js
是当前模块的目录名。(例如:\uuu dirname
)/home/kyle/some/dir
所以基本上你可以这样做:
fs.readFile(path.resolve(__dirname, 'settings.json'), 'UTF-8', callback);
使用resolve()而不是与“/”或“\”连接,否则会遇到跨平台问题
注意:_dirname是模块或包含脚本的本地路径。如果您正在编写一个需要知道主脚本路径的插件,它是:
require.main.filename
或者,仅获取文件夹名称:
require('path').dirname(require.main.filename)
当涉及到主脚本时,它非常简单:
process.argv[1]
从:
进程argv
包含命令行参数的数组。第一个元素是“node”,第二个元素是JavaScript文件的路径。接下来的元素将是任何其他命令行参数
如果需要知道模块文件的路径,请使用。每个Node.js程序的环境中都有一些全局变量,它表示有关进程的一些信息,其中一个是
\uu 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)
else
console.log(data.toString());
});
我知道这是一个很老的问题,我最初回答的问题被标记为重复的,直接在这里,但我遇到了一个问题,试图让jasmine记者工作,我不喜欢为了工作而不得不降级的想法。我发现jasmine reporters没有正确解析保存路径,实际上是将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
});
如果希望在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;
}
}
var path=require('path');
var命令=getCurrentScriptPath();
log(`Usage:${command}`);
函数getCurrentScriptPath(){
//从当前工作目录到此脚本位置的相对路径
var pathToScript=path.relative(process.cwd(),u文件名);
//检查当前工作目录是否与脚本相同
if(process.cwd()==\uu dirname){
//例如“/foobar.js”
返回“.”+path.sep+pathToScript;
}否则{
//例如“foo/bar/baz.js”
返回路径脚本;
}
}
如果您使用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
保存当前脚本的完整路径,因此我不使用它(尽管它可能是OP要求的;那么最好使用\uuuDirName
注意,在交互模式下,appDirectory=process.pkg?require('path').dirname(process.execPath):(\uuDirName | require('path').dirname(process.argv[0]))
为空\u dirname
- 对于交互模式,使用
获取节点可执行文件的路径,或使用process.argv[0]
获取当前目录process.cwd()
__dirname
当前模块的目录名。这与\u文件名的path.dirname()相同
示例:从/Users/mjr运行node Example.js
console.log(__dirname);
// Prints: /Users/mjr
console.log(path.dirname(__filename));
// Prints: /Users/mjr
对于您希望使用的ESModules:
import.meta.url
Node.js 10支持,其中
然后,要获得一个,必须使用:
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));
import path from 'path';
const __dirname = path.dirname(new URL(import.meta.url).pathname);
使用path
模块的basename
方法:
var path = require('path');
var filename = path.basename(__filename);
console.log(filename);
是上述示例所引用的文档
正如Dan指出的,Node正在使用“-experimentalmodules”标志进行工作
如果您使用的是--experimental modules
标志,则存在一个
另一种方法是获得:
对于包含当前模块的目录:
import { dirname } from 'path';
import { fileURLToPath } from 'url';
const __dirname = dirname(fileURLToPath(import.meta.url));
import path from 'path';
const __dirname = path.dirname(new URL(import.meta.url).pathname);
包含要导出的模块的任何文件夹中的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;
这将找到当前目录根目录中的所有文件,需要并导出与文件名stem具有相同导出名称的每个文件。如果您的目标只是解析json文件并与之交互,您通常可以通过var settings=require('./settings.json')更轻松地完成此操作
。当然,它是同步的fs IO,所以不要在运行时执行,但在启动时就可以了,一旦加载,它就会被缓存。@Marc谢谢!有一段时间我一直在绕开这样一个事实:每个模块都有一个u dirname。我的库中有一个嵌套结构,需要在几个地方知道我的应用程序的根。很高兴我知道