node.js:从模块内与npm对话

时间:2014-08-03 16:05:21

标签: javascript node.js npm

我想为全局安装的模块添加自我更新功能。有没有比这更好的方法?

require("child_process").exec("npm update -g module-name");

有一些documentation关于安装npm作为本地依赖项。这有必要吗?是否有关于如何执行updateinstall等命令的示例代码?

2 个答案:

答案 0 :(得分:2)

以下是我通常使用npm的系统副本而不是安装另一个npm副本作为本地模块的方法:

function loadNpm(cb) {
  require('child_process').exec('npm', function(err, stdout, stderr) {
    var m = /npm@[^ ]+ (.+)\n/i.exec(stdout);
    if (!m)
      return cb(new Error('Unable to find path in npm help message'));
    cb(undefined, require(m[1]));
  });
}


// usage ...
// only need to call `loadNpm()` once
loadNpm(function(err, npm) {
  if (err) throw err;
  // load() is required before using npm API
  npm.load(function(err, npm) {
    if (err) throw err;
    // e.g. npm.search('ssh', true, function(err, results) { console.dir(results); });
  });
});

答案 1 :(得分:2)

根据您的目标,以下是一些选项:

1)正如你所提到的那样通过exec()。不要忘记添加错误回调。

2)正如你所提到的那样使用npm包。

例如,我编写了一个快速脚本来全局安装Yeoman软件包,该软件运行良好。我没有看到很多文档,所以我开始阅读npm包本身的源代码。

var npm = require('npm');

npm.load (function (err, npm) {
    if (err) {
        console.log("Error loading");
        return;
    }

    npm.config.set('global', true);
    npm.commands.install(['yo'], function (err)  {
        if (err) {
            console.error("Installation failed");
        }
    });
});

3)如果这是你的目标,另一个选择就是拥有一个cron作业自动更新包。

4)您可能也对这个包https://github.com/tjunnone/npm-check-updates

感兴趣