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

时间:2013-12-19 16:02:55

标签: node.js npm

我找到了how to install npm packages programmatically,代码运行正常:

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软件包的第一个版本,我怎样才能在NodeJS端使用npm模块执行此操作?

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

4 个答案:

答案 0 :(得分:15)

NPM NodeJS API没有详细记录,但检查代码会有所帮助。

Here我们找到以下字符串:

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

答案 1 :(得分:8)

由于我正在为我的工作做这种实现,我编写了一个简单但高效的nodeJS模块来轻松处理该过程。

Github repository of npmi

npm install npmi

答案 2 :(得分:2)

我是模块的作者,允许你做你想到的。 请参阅live-plugin-manager

您可以从NPM,Github或文件夹中安装和运行几乎任何软件包。

这是一个例子:

import {PluginManager} from "live-plugin-manager";

const manager = new PluginManager();

async function run() {
  await manager.install("moment");

  const moment = manager.require("moment");
  console.log(moment().format());

  await manager.uninstall("moment");
}

run();

在上面的代码中,我在运行时安装moment包,加载并执行它。最后我卸载它。

在内部我不运行npm cli但实际下载包并在节点VM沙箱中运行。

要安装特定版本,请使用:

  await manager.install("moment", "2.20.1");

答案 3 :(得分:1)

当我编写具有依赖项的应用程序时,我使用package.json文件并将其包含在我的应用程序的目录中。它看起来可能有点像这样。

{
     "name": "MyApp",
     "description": "My App.",
     "version": "0.0.1",
     "dependencies": {
        "express": "3.4.3",
        "socket.io": "0.9.16"
     }
}

我认为你可以使用类似的格式从命令行安装NPM。使用package.json,你只需要执行npm install -d(假设-d代表“依赖”)

你的问题是以编程方式进行。您是否尝试过简单添加第二个参数(“npm @ version#”)?

如果我以编程方式进行,我可能会尝试这样的事情:

   var pjson = require('./package.json');

这样我就可以维护版本控制并使用package.json文件的简单性。

我在评论中添加了更多信息,如果你还没有看过,这里是npm install的文档。 https://npmjs.org/doc/cli/npm-install.html

我一直无法挖掘您特定案例的任何其他具体信息,也许没有方法可以通过编程方式按版本安装,但这没有意义,它必须是可行的。