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?


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


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 )


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

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.


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');

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('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 ) 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('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/

Przykład 2: instalacja w katalogu niestandardowym

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/

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

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

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

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

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

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 create-react-app@1.5.2

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.