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-alias3
etc, 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.x
itp ..
Oba te podejścia wydają się jednak niedbałe. Czy są lepsze?
Odpowiedzi:
Stan na dzień npm 6.9.0, npm obsługuje teraz aliasy pakietów. To realizuje tę samą składnię jako zastosowań przędz:
Dodaje to następujące elementy do
package.json
: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
:źródło
eslint
, ale nie wiedział, że został teraz nazwanyeslint6
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:
(na przykład kredyt trafia do https://github.com/callemall/material-ui/issues/7195#issuecomment-314547601 )
źródło
<alternative-name>@npm:<package-name>@<version>
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
require
specjalnie w swoich modułach.Następnie w swoim js możesz po prostu
require(jquery)
i / lubrequire(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.
źródło
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
require
tak:źródło
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:
źródło
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
Przykład 2: instalacja w katalogu niestandardowym
Przykład 3: instalacja z cichym lub głośnym standardowym wyjściem
Przykład 4: Zastąp istniejącą instalację
źródło
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
Po skonfigurowaniu tego shell package.json zainstalowałem dokładnie taką wersję aplikacji create-react-app, jakiej potrzebowałem
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:
Na koniec stworzyłem ten prosty skrypt basha jako wykonywalny
Zatem bezpośrednie uruchomienie tego skryptu bash spowoduje wykonanie starszej wersji aplikacji create-react-app:
źródło