3

有没有办法可以显示我们在 nodejs 中安装的 Express、Jade、Stylus.. 的版本。捕获当前版本并将其显示在浏览器中。

谢谢

4

2 回答 2

4

基本上是一个简单的

$ npm ls

做你想做的事:它以递归方式为你提供所有已安装模块、它们的版本和它们的依赖项的列表,并带有相同的信息。

正如您所要求的在您的浏览器中工作的解决方案:最简单的解决方案可能是使用child_process 模块从 Node.js 作为子进程运行该命令,并将子进程的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' ]);
于 2013-01-17T13:50:19.127 回答
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);

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

当然,这里的缺点是这将始终读取文件而不是使用来自 npm 的“真实”版本,但是由于您的节点应用程序无论如何都会读取文件,我不明白为什么不这样做。

于 2013-01-17T15:12:29.120 回答