Установите программно пакет 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.

Ответ 1

API NPM NodeJS плохо документирован, но проверка кода помогает.

Здесь мы находим следующую строку:

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 [email protected] /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."

Мой вопрос касается версии, поэтому мы можем: [email protected] установить 0.0.1 версию hello-world.

var npm = require("npm");
npm.load({
    loaded: false
}, function (err) {
  // catch errors
  npm.commands.install(["[email protected]"], 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;
}

Ответ 2

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

Github-хранилище npmi

или

npm install npmi

Ответ 3

Когда я пишу приложение с зависимостями, я использую файл 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. https://npmjs.org/doc/cli/npm-install.html

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

Ответ 4

Я являюсь автором модуля, который позволяет делать то, что вы имеете в виду. См. 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, но фактически загружаю пакеты и запускаю в изолированной программной среде node.

Для установки конкретной версии просто используйте:

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