Из-за 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
и т. Д.
Однако оба этих подхода кажутся небрежными. Есть лучшие?
Ответы:
Начиная с npm v6.9.0, npm теперь поддерживает псевдонимы пакетов. Он реализует тот же синтаксис, что и Yarn:
Это добавляет следующее к
package.json
:С этим синтаксисом также можно установить прямо из GitHub. Например, если вы хотите установить как версию реестра npm, так и вилку пакета GitHub
foobar
:источник
eslint
, но не знал, что теперь он названeslint6
Я хотел написать здесь для всех, кто использует Yarn. и попал сюда. Это более или менее простая замена для NPM, которая поддерживает алиасинг из коробки:
(кредит, например, идет на https://github.com/callemall/material-ui/issues/7195#issuecomment-314547601 )
источник
<alternative-name>@npm:<package-name>@<version>
Похоже, что "JSPM" может быть именно тем инструментом, который вы ищете. JSPM строится поверх NPM, но позволяет извлекать пакеты из нескольких источников (github, npm и т. Д.). Он использует универсальный загрузчик модулей System.js во внешнем интерфейсе для загрузки модулей и «использует плоское управление версиями для загрузки в папки с суффиксами версии», о которых легко рассуждать.
jspm.io
Когда вы устанавливаете пакет с помощью jspm, вы можете присвоить этому пакету определенное имя, которое вы можете позже указать
require
в своих модулях.Затем в вашем js вы можете просто
require(jquery)
и / илиrequire(jqueryOne)
мере необходимости, позволяя вам перемещаться вперед и назад по мере необходимости.То же самое касается любого пакета, который вы хотите использовать несколько версий.
источник
Это довольно сложно сделать чисто из-за того, как работает npm, поэтому я бы не пытался делать это в производственной среде.
Однако для интеграционного тестирования и аналогичных вариантов использования я создал пакет под названием multidep , который позволяет вам устанавливать несколько версий одного и того же пакета, а именно
require
:источник
Версия установки NPM ( https://github.com/scott113341/npm-install-version ) также является вариантом. По сути, он делает то же, что и некоторые другие решения здесь (с технической точки зрения), но его довольно просто использовать. Модули, установленные с номером версии (стандартный параметр команды @version, используемый NPM), предсказуемо устанавливаются в подпапку в node_modules с таким именем. Вы также можете управлять каталогом назначения для каждого модуля, что полезно для систем сборки.
Фрагмент кода использования из документации GitHub:
источник
install-npm-version
( https://github.com/scott-lin/install-npm-version ) - еще один вариант. Его можно использовать в командной строке или через программный интерфейс, написанный на TypeScript для современной разработки.Пример # 1: установка в каталог с версией (по умолчанию)
Пример # 2: установка в пользовательский каталог
Пример # 3: установка с тихим или шумным стандартным выводом
Пример # 4: перезаписать существующую установку
источник
В моем случае мне нужно было установить более старую версию create-response-app, чем та, которую я установил глобально, потому что я проходил курс, который требовал этой более старой версии для заданий.
Я создал новую папку только для этой старой версии, записал в нее компакт-диск и сделал
После настройки этой оболочки package.json я установил именно ту версию create-response-app, которая мне нужна.
который создал локальную папку node_modules со старой версией create-response-app.
Затем я создал простой сценарий bash (create-react-app.sh) как ярлык для этой старой версии и использовал переменную bash «$ @» для пересылки всех аргументов:
Наконец, я сделал этот простой исполняемый файл сценария bash
Таким образом, прямой запуск этого сценария bash выполнит старую версию create-response-app:
источник