Как установить несколько версий пакета с использованием npm
Из-за https://github.com/npm/npm/issues/2943 npm никогда не будет поддерживать возможность пакетов псевдонимов и установить несколько версий одного и того же пакета.
Обходные решения, опубликованные в проблеме github, могут работать для модулей pure-JS, но поскольку npm становится стандартом для управления интерфейсом frontend, пакеты теперь включают в себя различные активы, такие как CSS.
Есть ли способ обхода нескольких версий одного и того же пакета?
Лучшей идеей, которую я придумал, является "клонировать" пакет и публиковать его с немного другим именем.
Например, если вам нужно несколько версий jquery
, вы можете просто опубликовать пакеты с именем jquery-alias1
, jquery-alias2
, jquery-alias3
и т.д., а затем установить соответствующие версии в package.json
.
Или вы можете назвать пакеты в соответствии с их номером версии, например jquery-1.11.x
, jquery-2.1.x
и т.д.
Оба эти подхода кажутся неаккуратными. Есть ли лучшие?
Ответы
Ответ 1
Я хотел опубликовать здесь для тех, кто любит меня, используя Yarn и приземлился здесь. Это более или менее замещающая замена для NPM, которая поддерживает наложение псевдонимов из коробки:
yarn add [email protected]
yarn add [email protected]:[email protected]
then
import FlatButton from 'material-ui/FlatButton'; // v0.x
import Button from 'material-ui-next/Button'; // v1.x
(например, кредит относится к https://github.com/callemall/material-ui/issues/7195#issuecomment-314547601)
Ответ 2
Похоже, "JSPM" может быть именно тем инструментом, который вы ищете. JSPM построен на основе NPM, но позволяет извлекать пакеты из нескольких источников (github, npm и т.д.). Он использует универсальный загрузчик модулей System.js на внешнем интерфейсе для загрузки модулей и "использует плоское управление версиями для загрузки в папки с суффиксами версий", о которых легко рассуждать.
jspm.io
Когда вы устанавливаете пакет с помощью jspm, вы можете присвоить этому пакету псевдоним для определенного имени, которое впоследствии может require
конкретно в ваших модулях.
$ jspm install jquery
... (status msgs) ...
ok Installed jquery as github:components/[email protected]^2.1.4 (2.1.4)
$ jspm install [email protected]
... (status msgs) ...
ok Installed jqueryOne as github:components/[email protected] (1.11.3)
github:components/jquery 1.11.3 2.1.4
Тогда в вашем js вы можете просто require(jquery)
и/или require(jqueryOne)
мере необходимости, позволяя вам переходить назад и вперед по мере необходимости.
То же самое относится к любому пакету, который вы хотели бы использовать в нескольких версиях.
Ответ 3
Это довольно сложно сделать чисто, из-за того, как работает npm, поэтому я бы не попытался сделать это на производстве.
Однако для тестирования интеграции и аналогичных вариантов использования я создал пакет под названием multidep, который позволяет устанавливать несколько версий одного и того же пакет и require
их так:
var multidepPackages = require('multidep')('test/multidep.json');
var jquery1 = multidepRequire('jquery', '1.11.3');
var jquery2 = multidepRequire('jquery', '2.1.4');
Ответ 4
Версия установки NPM (https://github.com/scott113341/npm-install-version) также является опцией. Это, по сути, делает то, что некоторые из других решений здесь делают (технически говорящие), но довольно просты в использовании. Модули, установленные с номером версии (стандартный параметр команды @version, используемый NPM), предположительно устанавливаются в подпапке под node_modules с этим именем. Вы также можете управлять параметром назначения для каждого модуля, что полезно для систем сборки.
Фрагмент кода использования из документов GitHub:
const niv = require('npm-install-version');
const benchmark = require('./some-benchmark-function.js');
niv.install('[email protected]');
// installs [email protected] to node_modules/[email protected]/
niv.install('[email protected]');
// installs [email protected] to node_modules/[email protected]/
const csjs_old = niv.require('[email protected]');
const csjs_new = niv.require('[email protected]');
// require the old and new versions of csjs
benchmark([csjs_old, csjs_new], 'some-test-input');
// run our fake benchmark function on the old and new versions of csjs
Ответ 5
install-npm-version
(https://github.com/scott-lin/install-npm-version) - это еще один вариант. Его можно использовать в командной строке или через программный интерфейс - написанный на TypeScript для современной разработки.
Пример № 1: установка в версионный каталог (по умолчанию)
import inv = require('install-npm-version');
inv.Install('[email protected]');
// installs [email protected] to node_modules/[email protected]/
inv.Install('[email protected]');
// installs [email protected] to node_modules/[email protected]/
Пример №2: установка в пользовательский каталог
import inv = require('install-npm-version');
inv.Install('[email protected]', { 'Destination': 'some/path/chalk' });
// installs [email protected] to node_modules/some/path/chalk/
Пример № 3: установка с тихим или шумным стандартным выводом
import inv = require('install-npm-version');
inv.Install('[email protected]', { 'Verbosity': 'Silent' });
inv.Install('[email protected]', { 'Verbosity': 'Debug' });
Пример № 4: перезаписать существующую установку
import inv = require('install-npm-version');
inv.Install('[email protected]', { 'Destination': 'mydir' });
// installs [email protected] to node_modules/mydir/
inv.Install('[email protected]', { 'Destination': 'mydir' });
// does not install [email protected] since node_modules/mydir/ already exists
inv.Install('[email protected]', { 'Destination': 'mydir', 'Overwrite': true });
// installs [email protected] to node_modules/mydir/ by overwriting existing install
Ответ 6
Начиная с npm v6.9.0, npm теперь поддерживает псевдонимы пакетов. Он реализует тот же синтаксис, который использует Yarn:
npm install [email protected]:[email protected]
npm install [email protected]:[email protected]
Это добавляет следующее в package.json
:
"dependencies": {
"jquery2": "npm:[email protected]^2.2.4",
"jquery3": "npm:[email protected]^3.4.1"
}
Также возможно установить прямо из Github с этим синтаксисом. Например, если вы хотите установить как версию реестра npm, так и ветвь Github пакета:
npm install foobar
npm install [email protected]:username/foobar