【问题标题】:Getting the path of a module in node (the module folder, not the entry file)获取节点中模块的路径(模块文件夹,而不是入口文件)
【发布时间】:2019-06-30 15:21:19
【问题描述】:

我希望能够在构建时在节点中查找模块的路径。

我在文档中看到有这样的require.resolve

// get path to module 'foo'
console.log(require.resolve('foo'));

但这会寻找模块入口点的路径。如果模块没有入口点(它只是共享文件的集合),则require.resolve 失败。

我知道在某些情况下我可以查看node_modules/name-of-module,但在各种情况下这是错误的。例如,我将“foo”作为依赖项,将“foo”作为“bar”作为依赖项。然后默认情况下 bar 将在 project-root/node_modules/bar 但如果我 npm link 'foo' 那么 'bar' 将在 project-root/node_modules/foo(link)/node_modules/bar

我考虑过放置一个虚拟条目,它适用于我自己的模块,但不适用于我无法控制的模块。

有没有办法找到给定模块的根文件夹的路径?

还有一种方法可以从其他模块的上下文中获取模块的路径。

换句话说,如果我这样做,通常情况下

const bar = require('bar');

这就是我的 package.json 中引用的“bar”模块。想象一下,还有一些其他包 'foo' 包含不同版本的 'bar'。我想能够问“'bar'包'foo'会得到什么路径?”

我试图解决的实际问题是在构建时将一些文件从某个模块复制到我构建的输出文件夹中,但要做到这一点,我需要能够找到该模块。

我可以一起破解一些东西,但假设他们是正确的方式,那么以“正确”的方式来做会很好。

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    我想对于直接依赖我可以这样做

    const path = require('path');
    const fs = require('fs');
    
    function exists(filename) {
      try {
        const stat = fs.statSync(filename);
        return true;
      } catch (e) {
        return false;
      }
    }
    
    function getModulePath(name) {
      for (const dirname of require.resolve.paths(name)) {
        const filename = path.join(dirname, name);
        if (exists(filename)) {
          return filename;
        }
      }
    }
    
    

    对于间接依赖,我必须让直接依赖进行查找。至少对于问题中提到的npm link 案例。

    【讨论】:

      【解决方案2】:

      我认为这会成功:

      function pathForModuleAsAnotherModule(get, another) {
          let m = require('module')
          let anotherLocation = require.resolve(another);
          let anotherDir = require('path').dirname(anotherLocation);
          let anotherPaths = m.Module._nodeModulePaths(anotherDir)
          return require.resolve(get, { paths: anotherPaths })
      }
      

      然后:

      pathForModuleAsAnotherModule('foo', 'bar')
      

      【讨论】:

      • 谢谢,但正如问题中指出的那样,require.resolve(another) 不起作用,因为它需要一个入口点。
      • 那么这是不可能的。你不知道它是 'node_modules/xxx' (npm) 还是 'node_modules/aaa/node_modules/xxx' (pnpm) 或 '/home/user/node_modules/xxx' (npm install of xxx with package.json there )
      猜你喜欢
      • 2019-01-27
      • 2020-05-21
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 2022-12-11
      • 2017-07-04
      • 2014-10-14
      相关资源
      最近更新 更多