Подтвердить что ты не робот

Как установить несколько версий пакета с использованием 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 и т.д.

Оба эти подхода кажутся неаккуратными. Есть ли лучшие?

4b9b3361

Ответ 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