一尘不染

以编程方式安装提供其版本的NPM软件包

node.js

我找到了如何以编程方式安装npm软件包,并且代码可以正常工作:

var npm = require("npm");
npm.load({
    loaded: false
}, function (err) {
  // catch errors
  npm.commands.install(["my", "packages", "to", "install"], function (er, data) {
    // log the error or data
  });
  npm.on("log", function (message) {
    // log the progress of the installation
    console.log(message);
  });
});

如果要安装hello-world软件包的第一个版本,如何使用npm模块在NodeJS端进行安装?

我知道我可以使用子进程,但是我想选择npm模块解决方案。


阅读 250

收藏
2020-07-07

共1个答案

一尘不染

NPM NodeJS API没有很好的文档说明,但是检查代码会有所帮助。

在这里,我们找到以下字符串:

install.usage = "npm install"
              + "\nnpm install <pkg>"
              + "\nnpm install <pkg>@<tag>"
              + "\nnpm install <pkg>@<version>"
              + "\nnpm install <pkg>@<version range>"
              + "\nnpm install <folder>"
              + "\nnpm install <tarball file>"
              + "\nnpm install <tarball url>"
              + "\nnpm install <git:// url>"
              + "\nnpm install <github username>/<github project>"
              + "\n\nCan specify one or more: npm install ./foo.tgz bar@stable /some/folder"
              + "\nIf no argument is supplied and ./npm-shrinkwrap.json is "
              + "\npresent, installs dependencies specified in the shrinkwrap."
              + "\nOtherwise, installs dependencies from ./package.json."

我的问题是关于版本的,所以我们可以做:hello-world@0.0.1安装的0.0.1版本hello-world

var npm = require("npm");
npm.load({
    loaded: false
}, function (err) {
  // catch errors
  npm.commands.install(["hello-world@0.0.1"], function (er, data) {
    // log the error or data
  });
  npm.on("log", function (message) {
    // log the progress of the installation
    console.log(message);
  });
});

我没有进行测试,但是我确信我们可以使用任何格式的install.usage解决方案。

我编写了一个函数,该函数将dependencies对象转换为可以传递给install函数调用的数组。

dependencies:

{
   "hello-world": "0.0.1"
}

该函数获取package.json文件的路径并返回字符串数组。

function createNpmDependenciesArray (packageFilePath) {
    var p = require(packageFilePath);
    if (!p.dependencies) return [];

    var deps = [];
    for (var mod in p.dependencies) {
        deps.push(mod + "@" + p.dependencies[mod]);
    }

    return deps;
}
2020-07-07