Określ ścieżkę do node_modules w package.json

96

Czy istnieje sposób na przeniesienie katalogu node_modules w aplikacji do, powiedzmy, / vendor / node_modules, tak jak robi to Bower z plikiem bowerrc? Myślałem, że można to określić w pliku package.json, ale nie mogę znaleźć rozwiązania. Twoja pomoc jest bardzo ceniona.

sztywny
źródło
@blunderboy dzięki za link. To szalone, że nie ma na to prostszego sposobu. No cóż.
sturoid
27
Nie jestem pewien, dlaczego zaakceptowałeś odpowiedź, która wyraźnie nie odpowiada na twoje pytanie. Pytasz, jak ustawić ścieżkę do node_modules inpackage.json , a odpowiedź xShirase po prostu nie zapewnia sposobu, aby to zrobić.
Mark Amery,
4
Prawdopodobnie przyjął odpowiedź, ponieważ jest to bardzo wyraźnie problem XY, a alternatywne rozwiązanie jest lepsze niż „przepraszam, to niemożliwe”.
Jake Holzinger

Odpowiedzi:

59

tak, możesz, po prostu ustaw zmienną env NODE_PATH:

export NODE_PATH='yourdir'/node_modules

Według doc:

Jeśli zmienna środowiskowa NODE_PATH jest ustawiona na rozdzieloną dwukropkami listę ścieżek bezwzględnych, węzeł przeszuka te ścieżki w poszukiwaniu modułów, jeśli nie zostaną znalezione gdzie indziej. (Uwaga: w systemie Windows NODE_PATH jest rozdzielany średnikami zamiast dwukropków).

Dodatkowo węzeł będzie wyszukiwał w następujących lokalizacjach:

1: $ HOME / .node_modules

2: $ HOME / .node_libraries

3: $ PREFIX / lib / node

Gdzie $ HOME to katalog osobisty użytkownika, a $ PREFIX to skonfigurowany przedrostek_węzła węzła.

Są to głównie przyczyny historyczne. Zachęcamy do lokowania swoich zależności lokalnie w folderach node_modules. Będą ładowane szybciej i bardziej niezawodnie.

Źródło

xShirase
źródło
1
To wspaniale. Więc w moim przypadku, gdy mam lokalne moduły node_modules do każdej aplikacji, którą buduję, czy zrobiłbym ten eksport w pliku js w projekcie?
sturoid
3
nie, to zmienna środowiskowa, jest konfigurowana na poziomie systemu. Musisz więc wpisać to w swoim terminalu. Zmienne env są dostępne w aplikacji węzła wprocess.env
xShirase
Hmmm brzmi dobrze. Będę musiał się temu dokładniej przyjrzeć. Dzięki za pomoc.
sturoid
114
Nie wydaje mi się, żeby to była odpowiedź na pytanie: prosił o właściwość w pliku package.json, aby umieścić ścieżkę do LOCAL (poziom aplikacji) npm-Packages. Ta odpowiedź mówi mu, jak może przenieść GLOBALNIE (-g) zainstalowane pakiety do innego folderu.
David Losert
2
@IsmailIqbal Przepraszamy, właśnie zobaczyłem Twój komentarz. W świecie NPM minęły już dwa lata i zrobiliśmy spory krok z cache'owaniem, przędzą, a nawet npm5, webpackiem ... Powiedziałbym, że obsługa node_module jest obecnie dużo lepsza. W takim przypadku po prostu wykonałbym "instalację npm" we wszystkich lokalizacjach - ponieważ npm buforuje już zainstalowane pakiety, jest to to samo, co kopiowanie go ręcznie bez narzutu.
David Losert,
28

W skrócie: nie jest to możliwe i, jak się wydaje, nigdy nie będzie obsługiwane (zobacz tutaj https://github.com/npm/npm/issues/775 ).

Istnieje kilka niezrozumiałych problemów związanych z używaniem CLI lub ENV-Variables (zobacz aktualnie wybraną odpowiedź), .npmrc-Config-Files lub npm link- co je wszystkie mają wspólnego: nigdy nie są tylko specyficzne dla projektu, ale zawsze jakiś rodzaj z globalSolutions.

Dla mnie żadne z tych rozwiązań nie jest naprawdę czyste, ponieważ współtwórcy twojego projektu zawsze muszą tworzyć specjalną konfigurację lub mieć specjalną wiedzę - nie mogą po prostu npm installi to działa.

Więc: albo będziesz musiał umieścić swój plik package.json w tym samym katalogu, w którym chcesz zainstalować moduły node_modules, albo będziesz musiał żyć z faktem, że zawsze będą one znajdować się w katalogu głównym twojego projektu.

David Losert
źródło
16
„Jeśli chcesz inaczej przeliterować„ node_modules ”, przepraszam, nie możesz tego zrobić. To jest wbudowane w rdzeń węzła. Zmiana jest równoznaczna z budowaniem zupełnie innego menedżera pakietów. <== dobra robota przy użyciu zmiennych, jak sądzę.
stevedbrown
1
Komentarz z 2019 roku: wygląda na to, że yarn obsługuje nadpisywanie katalogu modułów. Przypuszczam, że przędza to nowy menedżer paczek.
Vanuan
10

Przędza obsługuje tę funkcję:

# .yarnrc file in project root
--modules-folder /node_modules

Ale Twoje wrażenia mogą się różnić w zależności od używanych pakietów. Nie jestem pewien, czy chciałbyś wejść do tej króliczej nory.

Vanuan
źródło
6

Nie jestem pewien, czy to właśnie miałeś na myśli, ale skończyłem na tym pytaniu ponieważ nie mogłem zainstalować node_moduleswewnątrz katalogu mojego projektu, ponieważ został on zamontowany na systemie plików, który nie obsługuje dowiązań symbolicznych (folder „współdzielony” maszyny wirtualnej ).

Znalazłem następujące obejście:

  1. Skopiuj package.jsonplik do folderu tymczasowego w innym systemie plików
  2. Biegnij npm installtam
  3. Skopiuj wynikowy node_moduleskatalog z powrotem do katalogu projektu, używając cp -r --dereferencedo rozwinięcia linków symbolicznych do kopii.

Mam nadzieję, że pomoże to komuś, kto trafi na to pytanie, szukając sposobu na przejście node_modulesdo innego systemu plików.

Inne opcje

Istnieje inne obejście, które znalazłem w problemie na githubie, z którym @Charminbear jest połączony , ale to nie działa, gruntponieważ nie jest obsługiwane NODE_PATHzgodnie z https://github.com/browserify/resolve/issues/136 :

powiedzmy, że masz /media/sf_sharedi nie możesz tam zainstalować dowiązań symbolicznych, co oznacza, że ​​nie możesz w rzeczywistości zainstalować npm z, /media/sf_shared/myprojectponieważ niektóre moduły używają dowiązań symbolicznych.

  • $ mkdir /home/dan/myproject && cd /home/dan/myproject
  • $ ln -s /media/sf_shared/myproject/package.json (możesz dowiązać symboliczne w tym kierunku, po prostu nie możesz go utworzyć wewnątrz / media / sf_shared)
  • $ npm install
  • $ cd /media/sf_shared/myproject
  • $ NODE_PATH=/home/dan/myproject/node_modules node index.js
Bogaty
źródło