将require.main传递给path.dirname

我试图找出原因

path.dirname(require.main)

返回. 或从我的应用程序的根目录到主模块运行的path,在本例中是相同的 – 我正在运行我的应用程序根目录下的gulpfile.js中定义的一个gulpfile.js任务。

文档说, path.dirname

返回path的目录名称。 类似于Unix dirname命令。

require.main是一个模块对象本身,而不是一个path。 这是一个path.dirname没有logging的function?


更多信息

require.main.filename是我的全局require.main.filename安装的深层path,这是require.main.filename我所寻找的。

我这样做,所以我可以我的当前节点模块获得一个根级别controllers目录的相对path,这可能会安装在任何位置。 最终的代码是这样的:

path.relative(__dirname, path.resolve(path.dirname(require.main), "controllers"))

哪个起作用 ,这个问题的目的只是为了了解path.dirname是如何工作的,因为它似乎与文档所说的不同。

编辑

所有这一切,看起来像path.resolve('.')将事实上映射到我的应用程序的根path, path.resolve('.', 'controllers')将映射出我的根控制器目录的path,和path.relative(__dirname, path.resolve('.', "controllers"))将映射出从当前位置到所述控制器目录的相对path。

所以,所有这些都比需要更多的工作,但我仍然很好奇,为什么path.dirname(require.main)行为,以及在那里logging。

看看节点repl中的函数。

 var path = require('path'); path.dirname.toString(); 

(path){\ n var result = posixSplitPath(path),\ n root = result [0],\ n dir = result [1]; \ n \ n if(!root &&!dir){\ n / / no dirname \ n return \'。\ n; \ n} \ n \ n if(dir){\ n //它有一个dirname,strip尾部的斜杠\ n dir = dir.substr(0,dir.length – 1); \ n} \ n \ n返回根目录+目录; \ 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函数返回一个数组。 如果path不是string,则返回空数组。 (关于posixSplitPath函数的一些猜测)

如果索引1,2的值是虚假的,则默认为'.'

libgen.h

我检出C的libgen.h ,这有关于dirname()说法:

描述

dirname()函数使用指向包含path名的string的指针,并返回指向该文件的父目录的path名的string的指针。 path中的尾部“/”字符不计入path的一部分。

如果path不包含'/',则dirname()返回一个指向string“。”的指针。 。 如果path是一个空指针或指向一个空string,dirname()返回一个指向string“。”的指针。 。

这个接口不需要是可重入的。

链接在这里: dirname

path.dirname({spoiled: 'beef'})也返回'。'。

那么path.dirname(7)

可能不是你想做什么,呃? 即使它给出了一个看起来很美味的答案,但对你来说可能并不好。

path.dirname(require.main.filename)更有用。

编辑:我没有检查代码,但它似乎不是只是一个工件将其转换为string。

path.dirname({foo: "cat/bar.baz"})也返回“。”