【问题标题】:Display the dependencies from package.json显示 package.json 中的依赖项
【发布时间】:2013-03-18 20:57:40
【问题描述】:

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

谢谢

【问题讨论】:

    标签: javascript node.js npm


    【解决方案1】:

    基本上很简单

    $ npm ls
    

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

    正如您要求在浏览器中运行的解决方案:最简单的解决方案可能是使用 child_process modulepipe 子进程的 stdout 属性从 Node.js 将该命令作为子进程运行到 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);
    

    当然你可以让它更漂亮、更舒适等等:-)

    来自 cmets 的更新:

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

    【讨论】:

    • 或者更好:npm ls --json 可以让您根据需要轻松解析和重新格式化输出。
    • 感谢戈洛的回复。我正在尝试这个解决方案并在cosole.log(npm); 中得到以下回复
    • [nodemon] 开始 node wamp.js { 域:null,_events:null,_maxListeners:10,_closesNeeded:3,_closesGot:0,signalCode:null,exitCode:null,killed:false,_handle: {所有者:[Circular],onexit:[Funct pid:0,stdin:{域:null,_events:null,_maxListeners:10,_handle:{writeQueueSize:0,所有者:[Circular],onread:[Function:onread] }, _pendingWriteReqs: 0, _flags: 0, _connectQueueSize: 0, destroy: false, errorEmitted: false, bytesRead: 0, _bytesDispatched: 0, allowHalfOpen: undefined, writable: true, readable: false }, stdout: { domain: null, _事件:`
    【解决方案2】:

    虽然 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 的“真实”版本,但是由于您的节点应用程序无论如何都会读取文件,我不明白为什么不这样做。

    【讨论】:

    • 除了您已经提到的缺点之外,还有另一个缺点:您没有获得依赖项的依赖项,除非您对其进行编程以通过文件夹递归地工作......然后我想启动一个子进程绝对是更好的方法(因为你甚至可以缓存结果,一旦你运行它)。
    猜你喜欢
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 2014-06-02
    相关资源
    最近更新 更多