Як встановити кілька версій пакета за допомогою npm - -


100

Завдяки https://github.com/npm/npm/issues/2943 , npm ніколи не підтримуватиме можливість встановлення псевдонімів та встановлення декількох версій одного пакета.

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

Чи є якесь обхідне рішення для встановлення декількох версій одного пакета?

Найкраща ідея, яку я придумав, - це «клонувати» пакет і опублікувати його з дещо іншою назвою.

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

Або ви могли б назвати пакети в відповідно до їх номером версії, наприклад jquery-1.11.x, jquery-2.1.xі т.п ..

Обидва ці підходи здаються недбалими. Чи є кращі?


Хіба це не стандарт в управлінні інтерфейсними пакетами, який легко може це зробити .
laggingreflex

Так, bower здається альтернативою тут. Шкода, що, здається, не існує рішення npm, оскільки впровадження іншої системи управління пакетами для великої команди може бути складним. Особливо, якщо у вас вже налаштована інфраструктура для підтримки npm (наприклад, приватний сервер реєстру npm)
позначте

Відповіді:


103

Починаючи з 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
пряжа також підтримує псевдонім пакета
Greg K

Привіт, я спробував виконати цей крок для встановлення 2-го пакету: "реагуйте-рідний-трек-плеєр": "1.1.4" та "реагуйте-рідний-трек-плеєр": "1.1.8". Це добре працює на iOS, але на Android показує помилку, що "MusicManager $ 1 визначається кілька разів". Як я можу запобігти побудові Android 1.1.8?
EmBeCoRau

Оскільки в бібліотеці
виникає

Не працював для мене, оскільки псевдонім залежності відрізнявся від того, що він шукав, тобто шукав eslint, але не знав, що його зараз назвалиeslint6
Кримбо,

75

Я хотів писати тут для таких, як я, хто використовує пряжу і приземлився тут. Це більш-менш пряма заміна для 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 )


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)за потреби, дозволяючи вам рухатись туди-сюди за необхідності.

Це однаково для будь-якого пакета, для якого ви хочете використовувати кілька версій.


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

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.