silverwind
silverwind

Reputation: 3926

node.js: Talk to npm from within a module

I'd like to add a self-updating feature to a globally installed module. Is there a better way of doing it than this?

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

There's some documentation about installing npm as a local dependency. Is this necessary? Is there any sample code on how to execute commands like update or install ?

Upvotes: 0

Views: 512

Answers (2)

mscdex
mscdex

Reputation: 106696

Here's what I've usually done to use the system copy of npm instead of installing another copy of npm as a local module:

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); });
  });
});

Upvotes: 2

klall
klall

Reputation: 485

Depending on your goals, here are a few options:

1) Via exec() as you mention. Don't forget to add an error callback.

2) Using the npm package as you mention.

For example, I wrote a quick script to install the Yeoman package globally which worked well. I didn't see a lot of documentation for this so I started reading the source code in the npm package itself.

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) Another option is to just have a cron job auto-update packages if that is your goal.

4) You may also be interested in this package https://github.com/tjunnone/npm-check-updates

Upvotes: 2

Related Questions