Jak mogę udostępnić wiele projektów katalogowi node_modules?

98

Za każdym razem, gdy tworzę projekty, muszę pobrać wszystkie zależności modułów węzłów. Bez kopiowania node_modules, czy istnieje możliwość udostępniania centralnych node_modules w wielu projektach?

jak poniżej, za każdym razem muszę uruchamiać wiele poleceń.

npm install gulp-usemin                                                                        
npm install gulp-wrap
npm install gulp-connect
npm install gulp-watch
npm install gulp-minify-css
npm install gulp-uglify
npm install gulp-concat
npm install gulp-less
npm install gulp-rename
npm install gulp-minify-html
verystrongjoe
źródło
3
Możesz je zainstalować we wspólnym katalogu nadrzędnym, jeśli taki istnieje. Węzeł przejdzie do katalogów, szukając requiremodułu d. W przeciwnym razie nie, nie ma oficjalnego „centralnego” node_modulesfolderu do użytku z programem require().
Jonathan Lonowski
Możesz zainstalować te pakiety globalnie, używając flagi globalnej. Nie musisz więc za każdym razem uruchamiać poleceń instalacji. npm install <npm_package_name> -g
Saba Hassan

Odpowiedzi:

92

Absolutnie możesz współdzielić katalog node_modules między projektami.

Z dokumentacji węzła :

Jeśli identyfikator modułu przekazany do require () nie jest modułem natywnym i nie zaczyna się od „/”, „../” ani „./”, wówczas węzeł zaczyna się w katalogu nadrzędnym bieżącego modułu i dodaje / node_modules i próbuje załadować moduł z tej lokalizacji.

Jeśli nie zostanie tam znaleziony, przechodzi do katalogu nadrzędnego i tak dalej, aż zostanie osiągnięty katalog główny systemu plików.

Na przykład, jeśli plik w „/home/ry/projects/foo.js” nazywa się require („bar.js”), wówczas węzeł będzie wyglądał w następujących lokalizacjach, w następującej kolejności:

/home/ry/projects/node_modules/bar.js /home/ry/node_modules/bar.js /home/node_modules/bar.js /node_modules/bar.js

Więc po prostu umieść folder node_modules w katalogu swoich projektów i umieść w nim dowolne moduły. Po prostu wymagaj ich jak zwykle. Gdy węzeł nie znajdzie katalogu node_modules w folderze projektu, automatycznie sprawdzi folder nadrzędny. Więc stwórz swoją strukturę katalogów następującą:

-myProjects
--node_modules
--myproject1
---sub-project
--myproject2

W ten sposób nawet zależności twojego podprojektu mogą korzystać z twojego głównego repozytorium node_modules.

Jedną z wad robienia tego w ten sposób jest to, że będziesz musiał ręcznie zbudować plik package.json (chyba że ktoś zna sposób na zautomatyzowanie tego za pomocą pomruku lub czegoś podobnego). Kiedy instalujesz swoje pakiety i dodajesz --save arg do npm installpolecenia, automatycznie dołącza je do sekcji zależności lub pliku package.json, co jest wygodne.

tpie
źródło
3
Dlaczego nie jest to akceptowane jako operacja odpowiedzi? Dalsze pytanie do @tpie, jeśli zasugerowałeś jedną strukturę projektu, jak zasugerowałbyś, jak zbudować pakiet package.json do zainstalowania z repozytorium modułu nadrzędnego.
diehell
@diehell Wygląda na to, że to „wszystko albo nic”. Jeśli wszystkie lub zależności znajdują się w katalogu nadrzędnym i nie ma katalogu node_modules w CWD, wówczas npm sprawdzi element nadrzędny i zainstaluje go, jeśli go znajdzie. Jeśli umieścisz folder node_modules w katalogu, zostanie on tam zainstalowany.
tpie
4
Nie widzę, jak współdzielenie node_modules może obsłużyć różne wersje pakietów, pakiety w node_modules nie są wersjonowane, w przeciwieństwie do npm-cache w c: \ users (Windows), czy ktoś na to wpadł?
cyberguest
Jak zmodyfikować mój paradygmat podczas pisania skryptów npm i plików package.json?
Maddocks,
18

Znalazłem sztuczkę, po prostu spójrz na łącza symboliczne (dowiązania symboliczne) w systemie Windows lub Linux , działa jak skróty, ale jest potężniejszy.

Po prostu musisz utworzyć folder Junctiondla swojego node_modulesfolderu w dowolnym miejscu. Skrzyżowanie to nic innego jak skrót do oryginalnego folderu node_modules. Utwórz go w folderze projektu, w którym zostałyby utworzone rzeczywiste moduły node_modules, gdyby zostały użyte npm install.

Aby to osiągnąć, potrzebujesz przynajmniej jednego node_modulesprawdziwego folderu, a następnie wykonaj połączenie z nim w innych projektach.

W systemie Windows możesz użyć wiersza polecenia lub aplikacji. Korzystanie z wiersza polecenia daje nieco większą kontrolę, korzystanie z aplikacji jest łatwiejsze. Sugeruję rozszerzenie powłoki linków .

Eymen Elkum
źródło
1
I cd do katalogu docelowego, należy uruchomić polecenie: mklink /d node_modules (source dir)\node_modules.
ChrisTorng,
1
Mój zespół stosuje tę metodę już od jakiegoś czasu. Chociaż naprawdę gardzę brakiem node_modulessamego folderu projektu, to działa. Pamiętaj tylko, aby przejść do właściwego node_modulesfolderu przed zainstalowaniem czegokolwiek nowego: P
Andrew Craswell
Ta metoda wydaje mi się nie działać. Kiedy używam węzłów symbolicznych lub węzłów, pojawia się następujący błąd z node-sass: Nie udało się zbudować modułu: „Błąd: moduł nie zarejestrował się samodzielnie”, a błąd zawiera dalsze szczegóły określające katalog, w którym istnieje „współdzielony” katalog node_modules. Jakieś pomysły?
flipcode
1
Jak uniknąć czyszczenia zależności podczas uruchamiania npm installw którejkolwiek z „połączonych” aplikacji?
Qwerty,
1
ale kiedy uruchamiam npm install <new-package>wszystkie pakiety, których nie ma w pliku package.json twojego bieżącego projektu, są usuwane.
Rohit Kaushal
18

Spróbuj pnpm zamiast npm.

pnpm używa dowiązań twardych i dowiązań symbolicznych do zapisania jednej wersji modułu tylko raz na dysku.

Zainstaluj za pomocą:

npm install -g pnpm

Aby zaktualizować istniejące instalacje (i podkatalogi), użyj:

pnpm recursive install

Lub użyj skrótu polecenia (pozostaw off -r, jeśli chcesz kierować tylko na jeden katalog)

pnpm -r i
Benson
źródło
8

Tak powinien wyglądać katalog główny

node_modules
Project 1
Project 2
Project 3
Project 4

po prostu otwórz plik Project 1/.angular-cli.json

zmienić schemat

"$schema": "./node_modules/@angular/cli/lib/config/schema.json",

do

"$schema": "./../node_modules/@angular/cli/lib/config/schema.json"

i nie zapomnij utworzyć node_modulespustego folderu w katalogu projektu

Shahzad Seraj
źródło
Jesteś moim bohaterem. Spędziłem nad tym tydzień . Dziękuję bardzo!!
Eliezer Berlin
5

Patrząc na niektóre artykuły, wydaje się, że Lerna jest dobrym narzędziem do zarządzania wieloma projektami w jednym katalogu ( monorepo). Obsługuje udostępnianie modułów bez duplikowania całych pakietów w każdym folderze i poleceń instalowania ich w wielu projektach.

pnpm to także proste i wydajne narzędzie, które nie powiela tych modułów, które są już zainstalowane dla innych projektów.

Chris
źródło
0

Załóżmy, że mając jeden moduł node_modules, powinien zawierać wszystkie pakiety dla wszystkich aplikacji. dzięki temu Twoje aplikacje będą również udostępniać większość unikatowych wpisów package.json (tylko nazwa powinna się zmienić)

mój pomysł byłby taki, aby mieć jeden root i wiele poziomów src, jak poniżej

root\package.json
root\node_modules
root\\..
root\app1\src\\..
root\app2\src\\..

jedynym problemem, z którym możesz się spotkać, byłoby utworzenie kopii zapasowej json (lub tsconfig) dla dowolnej aplikacji i przywrócenie ich podczas pracy nad nią lub skonfigurowanie skryptów startowych do obsługi dowolnej aplikacji

Fabio Guerrazzi
źródło