我正在试图找出原因
path.dirname(require.main)
返回.
或从我的应用程序的根目录到运行的主模块的路径,在这种情况下是相同的 - 我正在运行gulpfile.js
中根目录定义的gulp任务我的申请。
docs说path.dirname
返回路径的目录名称。与Unix dirname命令类似。
但是require.main
本身就是一个模块对象,而不是路径。这是path.dirname
的未记录的功能吗?
更多信息
对于它的价值,require.main.filename
是我全球gulp
安装的深层途径,远不及我所寻找的。 p>
我正在这样做,所以我可以从我当前的节点模块获得到根目录controllers
目录的相对路径,这可能恰好是安装在任意数量的位置。执行此操作的最终代码如下所示:
path.relative(__dirname, path.resolve(path.dirname(require.main), "controllers"))
有效,此问题的目的只是了解path.dirname
在这里的工作方式,因为它似乎与文档所说的不同。
修改
所有这一切,看起来path.resolve('.')
实际上将映射到我的应用程序根目录的路径,path.resolve('.', 'controllers')
将映射到我的根控制器目录的路径,path.relative(__dirname, path.resolve('.', "controllers"))
将绘制出从当前位置到所述控制器目录的相对路径。
所以这一切都比需要更多的工作,但我仍然很好奇为什么path.dirname(require.main)
表现得如此,以及记录的地方。
答案 0 :(得分:1)
path.dirname({spoiled: 'beef'})
也会返回'。'。
path.dirname(7)
可能不是你想做什么,是吗?虽然它给出的答案看起来很美味,但对你来说可能并不好。
path.dirname(require.main.filename)
更有用。
编辑: 我还没有检查过代码,但它似乎只是将其转换为字符串的工件。
path.dirname({foo: "cat/bar.baz"})
也会返回"。"
答案 1 :(得分:1)
查看节点repl中的函数。
var path = require('path');
path.dirname.toString();
'function(path){\ n var result = posixSplitPath(path),\ n root = result [0],\ n dir = result [1]; \ n \ n if(!root&&! dir){\ n //没有任何名字\ n返回\'。\'; \ n} \ n \ n if(dir){\ n //它有一个dirname,strip trailing slash \ n dir = dir.substr (0,dir.length - 1); \ n} \ n \ n返回root + dir; \ n}'
格式化:
function (path) {
var result = posixSplitPath(path),
root = result[0],
dir = result[1];
if (!root && !dir) {
// No dirname whatsoever
return '.';
}
if (dir) {
// It has a dirname, strip trailing slash
dir = dir.substr(0, dir.length - 1);
}
return root + dir;
}
看起来posixSplitPath函数返回一个数组。如果路径不是字符串,则结果为空数组。 (关于posixSplitPath函数的一点推测)
如果索引1,2的值是假的,则默认为'.'
我结帐了C libgen.h
并且有关于dirname()
的说法:
说明
dirname()函数获取指向包含路径名的字符串的指针,并返回指向字符串的指针,该字符串是该文件的父目录的路径名。路径中的尾随'/'字符不计入路径的一部分。
如果path不包含'/',则dirname()返回指向字符串“。”的指针。 。如果path是空指针或指向空字符串,则dirname()返回指向字符串“。”的指针。
此界面无需可重入。
此处链接:dirname