我可以从在 Node.js 中运行的 javascript 文件安装 NPM 包吗?例如,我想要一个脚本,我们称之为“script.js”,它以某种方式(...使用 NPM 或不...)安装通常可通过 NPM 获得的包。在这个例子中,我想安装“FFI”。(npm 安装 ffi)
我可以从在 Node.js 中运行的 javascript 安装 NPM 包吗?
确实可以以编程方式使用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')
像加载任何其他module一样使用它。要安装module,您需要使用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将尝试安装的module。
更高级的用法可以npm-cli.js
在源代码管理文件中找到。
您可以使用child_process。exec或execSync生成一个 shell,然后在该 shell 中执行所需的命令,缓冲任何生成的输出:
var child_process = require('child_process');
child_process.execSync('npm install ffi',{stdio:[0,1,2]});
如果提供了回调函数,则使用参数(错误、标准输出、标准错误)调用它。通过这种方式,您可以像手动操作一样运行安装并查看完整输出。
child_process.execSync() 方法通常与 child_process.exec() 相同,不同之处在于该方法在子进程完全关闭之前不会返回。
是的。您可以使用 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);
}
});
它实际上可能有点容易
var exec = require('child_process').exec;
child = exec('npm install ffi').stderr.pipe(process.stderr);
我花了很多时间试图让第一个示例在项目目录中工作,并在此处发布以防其他人发现它。据我所知,直接加载 NPM 仍然可以正常工作,但是因为它假设了 CLI,所以我们必须重复自己的设置:
// this must come before load to set your project directory
var previous = process.cwd();
process.chdir(project);
// this is the part missing from the example above
var conf = {'bin-links': false, verbose: true, prefix: project}
// this is all mostly the same
var cli = require('npm');
cli.load(conf, (err) => {
// handle errors
if(err) {
return reject(err);
}
// install module
cli.commands.install(['ffi'], (er, data) => {
process.chdir(previous);
if(err) {
reject(err);
}
// log errors or data
resolve(data);
});
cli.on('log', (message) => {
// log installation progress
console.log(message);
});
});