Программно установите пакет NPM, предоставляющий его версию

нашел как установить пакеты 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 пакет, как я могу сделать это на стороне NodeJS, используя npm модуль?

Я знаю, что могу использовать дочерний процесс, но я хочу выбрать npm решение модуль.

4 ответов


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 объект в массиве, который может быть передан the install вызов функции.

dependencies:

{
   "hello-world": "0.0.1"
}

функция получает путь к package.json file и возвращает массив строк.

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

поскольку я много делаю для своей работы, я написал простой, но эффективный модуль nodeJS для легкой обработки процесса.

репозиторий GitHub npmi

или

npm install npmi

Я автор модуля, который позволяет делать то, что вы имеете в виду. См.live-плагин-менеджер.

вы можете установить и запустить практически любой пакет из 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");

когда я пишу приложение, которое имеет зависимости я использую пакет.JSON-файл и включить его в каталог с моего приложения. Это выглядит примерно так.

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

Я думаю, вы можете использовать аналогичный формат для установки с NPM из командной строки. С пакетами.json вы просто делаете npm install-d (предполагая, что-d означает "зависимости")

вы вопрос о том, чтобы сделать это программно. Вы пробовали просто добавить второй аргумент, например ("npm@version #")?

Если бы я делал это программно, я мог бы попробовать что-то вроде этого:

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

таким образом, я могу осуществлять контроль и простота упаковки.файл json.

я добавил дополнительную информацию в комментариях, если вы еще не посмотрели, вот документы для установки npm. https://npmjs.org/doc/cli/npm-install.html

Я не смог откопать любую другую конкретную информацию о вашем конкретном случае, возможно нет никакого метода для установки по версии программно, но это не имеет смысла, это должно быть выполнимо.