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.



@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


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.


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.


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