2013-01-17 118 views

回答

4

基本上是一个简单的

$ npm ls 

你想要做什么:它给你所有已安装的模块,它们的版本,并与同一信息递归依赖列表。

正如你所要的那种在浏览器有效的解决方案:最简单的解决方案可能会是运行该命令从Node.js的使用child_process module一个子进程,并pipe孩子的stdout属性的响应流一个http服务器。

然后你在浏览器中输出npm ls

的基本框架是这样的:

var spawn = require('child_process').spawn, 
    http = require('http'); 

http.createServer(function (req, res) { 
    var npm = spawn('npm', [ 'ls' ]); 
    npm.stdout.pipe(res); 
}).listen(3000); 

当然,你可以把它更好,更舒适,等等:-)

更新的评论:

var npm = spawn('npm', [ 'ls', '--json' ]); 
+3

甚至更​​好:'npm ls --json'可以让你轻松解析和重新格式化显示所需的输出。 – JohnnyHK

+1

这是个不错的主意,@JohnnyHK :-) –

+0

感谢Golo的回应。我正在尝试这个soln,并在'cosole.log(npm);' – Vinay

0

虽然Golo Roden的回复描述了一种有效的方式,但我认为开放一个单独的过程只是为了阅读某个版本太多。

您特别提到package.json中的版本,那么为什么不读取该文件并解析它呢?我成功设法为此使用了fs模块。这里是我的应用程序:

var application_root = __dirname, 
    express = require('express'), 
    path = require('path'), 
    fs = require('fs'); 

var app = express(); 

app.configure(function() { 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
    app.use(express.static(path.join(application_root, "public"))); 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

app.get('/api', function (req, res) { 
    fs.readFile(application_root + '/package.json', function(err, fd) { 
     console.log(err); 
     console.log(fd); 
     res.send('File data: ' + fd); 
    }); 
}); 

app.listen(4242); 

这将显示的package.json文件的内容在你的根文件夹,当你请求/ API URL。如果您只想要特定依赖项的版本,则可以始终查询回调中fd对象的属性并显示该对象。

当然,这里的缺点是它总是读取文件,而不是使用npm中的'真实'版本,但是由于您的节点应用程序读取文件,我不明白为什么不这样做。

+0

除了你已经提到的缺点之外,还有另一个:你不会得到依赖关系的依赖关系,除非你编程它通过文件夹递归地工作......然后我认为开始一个子进程是肯定的更好的方式去(因为你甚至可以缓存结果,一旦你运行它)。 –

相关问题