jak zainstalować wiele wersji pakietu przy użyciu npm

107

Ze względu na https://github.com/npm/npm/issues/2943 npm nigdy nie będzie obsługiwać możliwości aliasowania pakietów i instalowania wielu wersji tego samego pakietu.

Obejścia opublikowane w sprawie github mogą działać w przypadku modułów czystego JS, ale ponieważ npm staje się standardem zarządzania pakietami frontendu, pakiety zawierają teraz różne zasoby, takie jak CSS.

Czy istnieje obejście umożliwiające zainstalowanie wielu wersji tego samego pakietu?

Najlepszym pomysłem jest „sklonowanie” pakietu i opublikowanie go pod nieco inną nazwą.

Na przykład, jeśli trzeba wiele wersji jquery, można publikować tylko pakiety o nazwie jquery-alias1, jquery-alias2, jquery-alias3etc, a następnie ustawić odpowiednie wersje w twojejpackage.json .

Czy można nazwać pakiety zgodnie z ich numerem wersji, np jquery-1.11.x, jquery-2.1.xitp ..

Oba te podejścia wydają się jednak niedbałe. Czy są lepsze?

znak
źródło
Nie ogranicza standardu zarządzania pakietami frontendu, który może to łatwo zrobić .
laggingreflex
Tak, altanka wydaje się tutaj alternatywą. Szkoda, że ​​nie ma rozwiązania npm, ponieważ wprowadzenie innego systemu zarządzania pakietami do dużego zespołu może być trudne. Zwłaszcza jeśli masz już infrastrukturę skonfigurowaną do obsługi npm (np. Prywatny serwer rejestru npm)
oznacz

Odpowiedzi:

115

Stan na dzień npm 6.9.0, npm obsługuje teraz aliasy pakietów. To realizuje tę samą składnię jako zastosowań przędz:

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

Dodaje to następujące elementy do package.json:

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

Za pomocą tej składni można również zainstalować bezpośrednio z GitHub. Na przykład, jeśli chcesz zainstalować zarówno wersję rejestru npm, jak i rozwidlenie GitHub pakietu foobar:

npm install foobar
npm install foobar-fork@github:username/foobar
Rens Baardman
źródło
1
yarn obsługuje również aliasy pakietów
Greg K
Cześć, próbowałem tego kroku zainstalować pakiet 2 to: "React-native-track-player": "1.1.4" i "aware-native-track-player": "1.1.8". Działa dobrze na iOS, ale na Androidzie wyświetla błąd, że „MusicManager $ 1 jest zdefiniowany wiele razy”. Jak mogę uniemożliwić Androidowi tworzenie wersji 1.1.8?
EmBeCoRau
Ponieważ jakiś konflikt w bibliotece, muszę używać 1.1.8 na iOS i 1.1.4 na Androidzie
EmBeCoRau
Nie działa na mnie jak alias dependancy różniły się co szukał, to znaczy szukał eslint, ale nie wiedział, że został teraz nazwanyeslint6
Crimbo
77

Chciałem napisać tutaj dla każdego, kto używa Yarn i wylądował tutaj. Jest to mniej lub bardziej bezpośredni zamiennik NPM, który obsługuje aliasing po wyjęciu z pudełka:

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

(na przykład kredyt trafia do https://github.com/callemall/material-ui/issues/7195#issuecomment-314547601 )

tmahle
źródło
18
Dziękuję Ci. Wystarczy wyjaśnić, że ogólna formuła to <alternative-name>@npm:<package-name>@<version>
NikosKeyz
5

Wygląda na to, że „JSPM” może być dokładnie tym narzędziem, którego szukasz. JSPM buduje się na bazie NPM, ale umożliwia pobieranie pakietów z wielu źródeł (github, npm itp.). Używa uniwersalnego modułu ładującego System.js w interfejsie użytkownika do ładowania modułów i „używa prostego zarządzania wersjami w celu pobrania do folderów z sufiksem wersji”, co jest łatwe do uzasadnienia.

jspm.io

Kiedy instalujesz pakiet za pomocą jspm, możesz aliasować ten pakiet do określonej nazwy, którą możesz później requirespecjalnie w swoich modułach.

$ jspm install jquery
... (status msgs) ...
ok   Installed jquery as github:components/jquery@^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

Następnie w swoim js możesz po prostu require(jquery)i / lub require(jqueryOne)w razie potrzeby, pozwalając ci poruszać się tam i z powrotem w razie potrzeby.

To samo dotyczy każdego pakietu, którego chcesz używać w wielu wersjach.

JemBijoux
źródło
2

Jest to dość trudne do zrobienia czysto, ze względu na sposób działania npm, więc unikałbym próby zrobienia tego w produkcji.

Jednak do testów integracyjnych i podobnych przypadków użycia stworzyłem pakiet o nazwie multidep , który pozwala zainstalować wiele wersji tego samego pakietu i requiretak:

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

var jquery1 = multidepRequire('jquery', '1.11.3');
var jquery2 = multidepRequire('jquery', '2.1.4');
Jo Liss
źródło
0

Wersja instalacyjna NPM ( https://github.com/scott113341/npm-install-version ) jest również opcją. Zasadniczo robi to, co robią niektóre inne rozwiązania tutaj (technicznie rzecz biorąc), ale jest dość prosty w użyciu. Moduły instalowane z numerem wersji (standardowy parametr polecenia @version używany przez NPM) są zgodnie z przewidywaniami instalowane w podfolderze w sekcji node_modules o tej nazwie. Możesz także kontrolować docelowy katalog na moduł - co jest przydatne w przypadku systemów kompilacji.

Fragment kodu użycia z GitHub Docs:

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
SylonZero
źródło
0

install-npm-version( https://github.com/scott-lin/install-npm-version ) to kolejna opcja. Można go używać w wierszu poleceń lub za pośrednictwem interfejsu programistycznego - napisanego w języku TypeScript do nowoczesnego programowania.

Przykład 1: instalacja w wersjonowanym (domyślnym) katalogu

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]/

Przykład 2: instalacja w katalogu niestandardowym

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

inv.Install('[email protected]', { 'Destination': 'some/path/chalk' });
// installs [email protected] to node_modules/some/path/chalk/

Przykład 3: instalacja z cichym lub głośnym standardowym wyjściem

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

inv.Install('[email protected]', { 'Verbosity': 'Silent' });
inv.Install('[email protected]', { 'Verbosity': 'Debug' });

Przykład 4: Zastąp istniejącą instalację

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
Scott Lin
źródło
0

W moim przypadku musiałem zainstalować starszą wersję aplikacji create-react-app niż ta, którą zainstalowałem globalnie, ponieważ brałem udział w kursie, który wymagał tej starszej wersji do zadań.

Utworzyłem nowy folder tylko po to, aby zawierał starszą wersję, dodałem do niego płytę CD i wykonałem plik

npm init

Po skonfigurowaniu tego shell package.json zainstalowałem dokładnie taką wersję aplikacji create-react-app, jakiej potrzebowałem

npm install [email protected]

który utworzył lokalny folder node_modules ze starszą wersją aplikacji create-react-app.

Następnie utworzyłem prosty skrypt bash (create-react-app.sh) jako skrót do tej starszej wersji i użyłem zmiennej bash „$ @” do przekazania wszystkich argumentów:

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

Na koniec stworzyłem ten prosty skrypt basha jako wykonywalny

chmod u+x create-react-app.sh

Zatem bezpośrednie uruchomienie tego skryptu bash spowoduje wykonanie starszej wersji aplikacji create-react-app:

./create-react-app.sh  --version
1.5.2
Stefan Musarra
źródło