确定从正在运行的node.js应用程序中使用的NPM模块

时间:2012-04-22 06:46:54

标签: node.js npm

除了在项目根目录中获取package.json文件之外,有没有办法确定正在运行的node.js应用程序的依赖项列表?节点是否将此元信息保留为全局命名空间中的某些var?

2 个答案:

答案 0 :(得分:6)

如果您只是在应用程序目录中查找当前安装的npm软件包,则可以安装npm软件包(npm install -g npm)和programatically调用ls列出已安装的软件包和依赖关系树。

显然,这与应用程序中安装的软件包是否实际上require无关。

用法并没有很好的记录,但这应该可以让你开始。

var npm = require('npm');

npm.load(function(err, npm) {
    npm.commands.ls([], true, function(err, data, lite) {
        console.log(data); //or lite for simplified output
    });
});

e.g:

{ dependencies:
   { npm: { version: '1.1.18', dependencies: [Object] },
     request: { version: '2.9.202' } } }

否则,我认为唯一的另一个选择是内省module模块以获取有关当前加载/缓存的模块路径的信息。然而,这绝对不是作为公共API开发的。我不确定是否有任何替代方案,所以如果有这样的话,我会很想听。

var req = require('request'); // require some module for demo purposes
var m = require('module');

// properties of m contain current loaded module info, e.g. m._cache

答案 1 :(得分:2)

我相信你可以使用require-analyzer,根据Isaacs的某些作品(可能会错过一些)。你可以在11:55从Nodeup's first podcast听到这个。

或者您可以尝试James node-detective,它可能会更好地找到您的依赖项(但不是通过运行代码),而是因为Javascript动态性(12:46)。

  

<强>侦探

     

无论使用a如何疯狂嵌套,都可以找到对require()的所有调用   适当的AST步行。

P.S:将那些package.json变量暴露给node.js你可以使用node-pkginfo