在npm决定放弃程序化API后如何以编程方式安装npm包

4

在 npm 8.0 之前,可以通过以下方式以编程方式安装 npm 包:

const npm = require('npm');
npm.load((error) => {
    if (error) return console.log(error);
    npm.commands.install([package], (error, data) => {
        if (error) return console.log(error);
        // command succeeded, and data might have some info
    });
    npm.on('log', (message) => {
        console.log(message);
    });
});

但是,他们决定重构代码并放弃了对编程API的支持。当然,有一种选择是保持npm版本低于7.24.2,这是最后一个支持的版本,但在这些版本中发现了一些漏洞,尽管在我的情况下它们是无害的,但控制台对用户来说看起来很可怕。

是否有可靠的替代方案解决此问题?


执行了上述代码并收到了以下消息:错误:程序化API已在npm v8.0.0中删除。 - Alexey Obukhov
@AlexeyObukhov 是的,这正是我所说的! :) - Sorin GFS
是的,现在无法使用这段代码。其他选项:命令行或其他库 - Alexey Obukhov
@AlexeyObukhov,我看到了那个库,谢谢,但它看起来已经过时了,最后更新于3年前,只是为了升级依赖项而存在。这个库创建于5年前。我认为自从npm支持停止以来,应该有更可靠的东西可以替代它,因为有很多库依赖于这个功能。 - Sorin GFS
1个回答

1
使用child_process解决。
const { exec } = require('child_process');

const run = async (cmd) => {
    const child = exec(cmd, (err) => {
        if (err) console.error(err);
    });
    child.stderr.pipe(process.stderr);
    child.stdout.pipe(process.stdout);
    await new Promise((resolve) => child.on('close', resolve));
};

module.exports = run;

然后...在另一个文件中的某个函数中我们可以调用:
await run(`npm install ${package}`);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接