将require.main传递给path.dirname

时间:2015-10-05 14:02:56

标签: javascript node.js

我正在试图找出原因

path.dirname(require.main)

返回.或从我的应用程序的根目录到运行的主模块的路径,在这种情况下是相同的 - 我正在运行gulpfile.js中根目录定义的gulp任务我的申请。

docspath.dirname

  

返回路径的目录名称。与Unix dirname命令类似。

但是require.main本身就是一个模块对象,而不是路径。这是path.dirname的未记录的功能吗?

更多信息

对于它的价值,require.main.filename是我全球gulp安装的深层途径,远不及我所寻找的。

我正在这样做,所以我可以从我当前的节点模块获得根目录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)表现得如此,以及记录的地方。

2 个答案:

答案 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的值是假的,则默认为'.'

libgen.h

我结帐了C libgen.h并且有关于dirname()的说法:

  

说明

     
    

dirname()函数获取指向包含路径名的字符串的指针,并返回指向字符串的指针,该字符串是该文件的父目录的路径名。路径中的尾随'/'字符不计入路径的一部分。

         

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

         

此界面无需可重入。

  

此处链接:dirname