我可以从运行在Node.js中的JavaScript安装NPM包吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我可以从运行在Node.js中的javascript文件安装NPM包吗?例如,我想要一个脚本,让我们称之为“script.js”,以某种方式(...使用NPM或不...)安装通常通过NPM可用的软件包。在这个例子中,我想安装“FFI”。(npm install ffi)

提问于
用户回答回答于

确实有可能以编程方式使用npm,并在文档的旧版本中对其进行了概述。它已从官方文档中删除,但仍存在于源代码管理中,并具有以下声明:

虽然npm可以通过编程方式使用,但其API只能用于CLI,并且不能保证其适用于任何其他目的。如果你想使用npm来可靠地执行一些任务,最安全的做法是用适当的参数调用所需的npm命令。 npm的语义版本是指CLI本身,而不是基础API。即使npm的版本表明没有根据semver进行重大更改,内部API也不能保证保持稳定

在原始文档中,以下是提供的代码示例:

var npm = require('npm')
npm.load(myConfigObject, function (er) {
  if (er) return handlError(er)
  npm.commands.install(['some', 'args'], function (er, data) {
    if (er) return commandFailed(er)
    // command succeeded, and data might have some info
  })
  npm.registry.log.on('log', function (message) { ... })
})

由于npm存在于node_modules文件夹中,因此可以require('npm')像使用其他模块一样加载它。要安装模块,您需要使用npm.commands.install()

如果你需要查看源代码,那么它也在GitHub上。下面是代码的一个完整的工作示例,它等价于npm install没有任何命令行参数的情况下运行:

var npm = require('npm');
npm.load(function(err) {
  // handle errors

  // install module ffi
  npm.commands.install(['ffi'], function(er, data) {
    // log errors or data
  });

  npm.on('log', function(message) {
    // log installation progress
    console.log(message);
  });
});

请注意,安装函数的第一个参数是一个数组。数组中的每个元素都是npm将尝试安装的模块。

npm-cli.js源代码管理中的文件中可以找到更高级的用法。

用户回答回答于

是。你可以使用child_process来执行系统命令

var exec = require('child_process').exec,
    child;

 child = exec('npm install ffi',
 function (error, stdout, stderr) {
     console.log('stdout: ' + stdout);
     console.log('stderr: ' + stderr);
     if (error !== null) {
          console.log('exec error: ' + error);
     }
 });

扫码关注云+社区