как установить несколько версий пакета с помощью npm

101

Из-за https://github.com/npm/npm/issues/2943 npm никогда не будет поддерживать возможность псевдонима пакетов и установки нескольких версий одного и того же пакета.

Обходные пути, опубликованные в проблеме github, могут работать для модулей на чистом JS, но поскольку npm становится стандартом для управления пакетами внешнего интерфейса, пакеты теперь включают в себя различные ресурсы, такие как CSS.

Есть ли обходной путь для установки нескольких версий одного и того же пакета?

Лучшая идея, которую я придумал, - это «клонировать» пакет и опубликовать его с немного другим именем.

Например, если вам нужно несколько версий jquery, вы можете просто опубликовать пакеты , называемые jquery-alias1, jquery-alias2, и jquery-alias3т.д., а затем установить соответствующие версии в вашем package.json.

Или вы можете назвать пакеты в соответствии с их номером версии, например jquery-1.11.x, jquery-2.1.xи т. Д.

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

отметка
источник
Не является стандартом для управления пакетами во внешнем интерфейсе, который может легко это сделать .
laggingreflex
Да, беседка здесь кажется альтернативой. Жаль, что, похоже, нет решения npm, так как внедрение другой системы управления пакетами в большую команду может быть трудным. Особенно, если у вас уже настроена инфраструктура для поддержки npm (например, частный сервер реестра npm)
отметьте

Ответы:

104

Начиная с npm v6.9.0, npm теперь поддерживает псевдонимы пакетов. Он реализует тот же синтаксис, что и Yarn:

npm install jquery2@npm:jquery@2
npm install jquery3@npm:jquery@3

Это добавляет следующее к package.json:

"dependencies": {
   "jquery2": "npm:jquery@^2.2.4",
   "jquery3": "npm:jquery@^3.4.1"
}

С этим синтаксисом также можно установить прямо из GitHub. Например, если вы хотите установить как версию реестра npm, так и вилку пакета GitHub foobar:

npm install foobar
npm install foobar-fork@github:username/foobar
Ренс Баардман
источник
1
yarn также поддерживает псевдонимы пакетов
Грег К.
Привет, я пробовал установить два пакета: «react-native-track-player»: «1.1.4» и «react-native-track-player»: «1.1.8». Он хорошо работает на iOS, но на Android показывает ошибку «MusicManager $ 1 определяется несколько раз». Как я могу предотвратить сборку Android 1.1.8?
EmBeCoRau
Из-за некоторого конфликта в библиотеке мне нужно использовать 1.1.8 на iOS и 1.1.4 на Android
EmBeCoRau
Не сработало для меня, так как псевдоним зависимости отличался от того, что он искал, то есть искал eslint, но не знал, что теперь он названeslint6
Crimbo
75

Я хотел написать здесь для всех, кто использует Yarn. и попал сюда. Это более или менее простая замена для NPM, которая поддерживает алиасинг из коробки:

yarn add material-ui@latest
yarn add material-ui-next@npm:material-ui@next
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 )

tmahle
источник
17
Спасибо. Просто чтобы уточнить, что общая формула <alternative-name>@npm:<package-name>@<version>
NikosKeyz
5

Похоже, что "JSPM" может быть именно тем инструментом, который вы ищете. JSPM строится поверх NPM, но позволяет извлекать пакеты из нескольких источников (github, npm и т. Д.). Он использует универсальный загрузчик модулей System.js во внешнем интерфейсе для загрузки модулей и «использует плоское управление версиями для загрузки в папки с суффиксами версии», о которых легко рассуждать.

jspm.io

Когда вы устанавливаете пакет с помощью jspm, вы можете присвоить этому пакету определенное имя, которое вы можете позже указать requireв своих модулях.

$ jspm install jquery
... (status msgs) ...
ok   Installed jquery as github:components/jquery@^2.1.4 (2.1.4)

$ jspm install jqueryOne=jquery@1.11.3
... (status msgs) ...
ok   Installed jqueryOne as github:components/jquery@1.11.3 (1.11.3)

      github:components/jquery 1.11.3 2.1.4

Затем в вашем js вы можете просто require(jquery)и / илиrequire(jqueryOne) мере необходимости, позволяя вам перемещаться вперед и назад по мере необходимости.

То же самое касается любого пакета, который вы хотите использовать несколько версий.

JemBijoux
источник
2

Это довольно сложно сделать чисто из-за того, как работает npm, поэтому я бы не пытался делать это в производственной среде.

Однако для интеграционного тестирования и аналогичных вариантов использования я создал пакет под названием multidep , который позволяет вам устанавливать несколько версий одного и того же пакета, а именно require:

var multidepPackages = require('multidep')('test/multidep.json');

var jquery1 = multidepRequire('jquery', '1.11.3');
var jquery2 = multidepRequire('jquery', '2.1.4');
Джо Лисс
источник
0

Версия установки 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('csjs@1.0.0');
// installs csjs@1.0.0 to node_modules/csjs@1.0.0/

niv.install('csjs@1.0.1');
// installs csjs@1.0.1 to node_modules/csjs@1.0.1/

const csjs_old = niv.require('csjs@1.0.0');
const csjs_new = niv.require('csjs@1.0.1');
// 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
SylonZero
источник
0

install-npm-version( https://github.com/scott-lin/install-npm-version ) - еще один вариант. Его можно использовать в командной строке или через программный интерфейс, написанный на TypeScript для современной разработки.

Пример # 1: установка в каталог с версией (по умолчанию)

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0');
// installs chalk@2.4.0 to node_modules/chalk@2.4.0/

inv.Install('chalk@2.4.1');
// installs chalk@2.4.1 to node_modules/chalk@2.4.1/

Пример # 2: установка в пользовательский каталог

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0', { 'Destination': 'some/path/chalk' });
// installs chalk@2.4.0 to node_modules/some/path/chalk/

Пример # 3: установка с тихим или шумным стандартным выводом

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0', { 'Verbosity': 'Silent' });
inv.Install('chalk@2.4.0', { 'Verbosity': 'Debug' });

Пример # 4: перезаписать существующую установку

import inv = require('install-npm-version');

inv.Install('chalk@2.4.0', { 'Destination': 'mydir' });
// installs chalk@2.4.0 to node_modules/mydir/

inv.Install('chalk@2.4.1', { 'Destination': 'mydir' });
// does not install chalk@2.4.1 since node_modules/mydir/ already exists

inv.Install('chalk@2.4.1', { 'Destination': 'mydir', 'Overwrite': true });
// installs chalk@2.4.1 to node_modules/mydir/ by overwriting existing install
Скотт Лин
источник
0

В моем случае мне нужно было установить более старую версию create-response-app, чем та, которую я установил глобально, потому что я проходил курс, который требовал этой более старой версии для заданий.

Я создал новую папку только для этой старой версии, записал в нее компакт-диск и сделал

npm init

После настройки этой оболочки package.json я установил именно ту версию create-response-app, которая мне нужна.

npm install create-react-app@1.5.2

который создал локальную папку node_modules со старой версией create-response-app.

Затем я создал простой сценарий bash (create-react-app.sh) как ярлык для этой старой версии и использовал переменную bash «$ @» для пересылки всех аргументов:

#!/bin/bash
{full-directory-path}/node_modules/create-react-app/index.js "$@"

Наконец, я сделал этот простой исполняемый файл сценария bash

chmod u+x create-react-app.sh

Таким образом, прямой запуск этого сценария bash выполнит старую версию create-response-app:

./create-react-app.sh  --version
1.5.2
Стефан Мусарра
источник