Jak ustawić lokalizację niestandardową dla lokalnej instalacji pakietu npm?

177

Czy można określić miejsce docelowe pakietu niestandardowego npm installza pomocą flagi polecenia lub zmiennej środowiskowej?

Domyślnie lokalne instalacje npm kończą się w node_modulesbieżącym katalogu, ale chcę, aby zostały na przykład zainstalowane node_modulesw innym katalogu vendor/node_modules. Jak mogę to zrobić?

pje
źródło
co próbujesz osiągnąć? zostało to omówione tutaj: stackoverflow.com/questions/13668097/…
Pascal Belloncle
10
@PascalBelloncle: Zamiast instalować pakiety w podkatalogach programu ./node_modules, chcę, aby npm zainstalował je w podkatalogach ./vendor/node_modules. (Albo
powiedzmy,
1
Zrozumiałem, że to jest to, co chcesz zrobić, co nie wydaje mi się możliwe po wyjęciu z pudełka. Plus require też by nie działał. Więc pytałem, dlaczego chcesz to zrobić. Może istnieje alternatywne rozwiązanie, aby robić to, co chcesz.
Pascal Belloncle
1
Instaluję pakiet wyłącznie dla jego pliku binarnego (tj. Będzie używany tylko w wierszu poleceń, a nigdy required), ale nie chcę go instalować globalnie.
pje,
Widzę. Zobacz moją sugestię poniżej.
Pascal Belloncle

Odpowiedzi:

180

TL; DR

Możesz to zrobić za pomocą --prefixflagi i --globalflagi *.

pje@friendbear:~/foo $ npm install bower -g --prefix ./vendor/node_modules
bower@0.7.0 /Users/pje/foo/vendor/node_modules/bower

* Mimo że jest to instalacja „globalna”, zainstalowane pojemniki nie będą dostępne z wiersza poleceń, chyba że ~/foo/vendor/node_modulesistnieją w PATH.

TL; R

Każdy konfigurowalny atrybut npmmożna ustawić w dowolnym z sześciu różnych miejsc. W kolejności ważności:

  • Flagi wiersza poleceń: --prefix ./vendor/node_modules
  • Zmienne środowiska: NPM_CONFIG_PREFIX=./vendor/node_modules
  • Plik konfiguracyjny użytkownika: $HOME/.npmrclub userconfigparam
  • Globalny plik konfiguracyjny: $PREFIX/etc/npmrclub userconfigparam
  • Wbudowany plik konfiguracyjny: path/to/npm/itself/npmrc
  • Domyślna konfiguracja : node_modules / npmconf / config-defs.js

Domyślnie pakiety zainstalowane lokalnie trafiają do ./node_modules. globalne trafiają do prefixzmiennej konfiguracyjnej ( /usr/localdomyślnie).

Możesz uruchomić, npm config listaby zobaczyć aktualną konfigurację i npm config editją zmienić.

PS

Ogólnie npmdokumentacja jest bardzo pomocna. Sekcja folderów jest dobrym strukturalnym omówieniem npm, a sekcja config odpowiada na to pytanie.

pje
źródło
2
Jak testuję, faktycznie, jeśli wykonam powyższe polecenie, zostanie zainstalowany w ./vendor/node_modules/lib/bowerużyciunpm#3.8.0
e-chmura
2
Robiąc to, otrzymuję błądNo version provided in package.json
FooBar
Ty piszesz bins won't be accessible through the command line. Program można oczywiście wywołać, używając pełnej ścieżki npm install [email protected] -g --prefix c:\my_npm` calling c: \ my_npm \ eslint --fix my.js`
Bernhard Döbler
13
Czy można osiągnąć coś podobnego za pomocą pliku package.json? tzn. jeśli uruchomię npm installw katalogu A z plikiem package.json, pakiety zostaną zainstalowane w katalogu B. Wygląda na to, że to rozwiązanie dotyczy instalowanych pojedynczych pakietów.
Ryan-Neal Mes
1
Czy istnieje sposób zainstalowania wszystkich zależności za pomocą tej metody? npm installinstaluje zależności lokalnie. npm install X -g -prefix "..."instaluje moduł X do prefiksu, npm install -g -prefix "..."instaluje bieżący pakiet do prefiksu.
AnnanFay
28

Jeśli chcesz to w konfiguracji, możesz ustawić konfigurację npm w następujący sposób:

npm config set prefix "$(pwd)/vendor/node_modules"

lub

npm config set prefix "$HOME/vendor/node_modules"

Sprawdź swoją konfigurację za pomocą

npm config ls -l

Lub jak mówi @pje i użyj --prefixflagi

Rimian
źródło
4
Uważam, że to ustawia globalny prefiks? W ten sposób npm installnadal będziesz instalować lokalnie, ./node_modulesale npm install -gzainstalujesz "$(pwd)/vendor/node_modules". Mogę sobie wyobrazić takie ustawienia, a potem zapominam o tym i wracam później, zastanawiając się, dlaczego moje pakiety globalne działają dziwnie.
AnnanFay
13

W przypadku OSX możesz przejść do swojego użytkownika $HOME(prawdopodobnie / Users / yourname /) i, jeśli jeszcze nie istnieje, utwórz .npmrcplik (plik używany przez npm do konfiguracji użytkownika) i utwórz katalog dla pakietów npm do być zainstalowane w (np. / Users / yourname / npm). W tym pliku .npmrc ustaw „prefiks” na nowy katalog npm, w którym będą instalowane „globalnie” pakiety npm; te "globalne" pakiety będą oczywiście dostępne tylko dla twojego konta użytkownika.

W .npmrc:

prefix=${HOME}/npm

Następnie uruchom to polecenie z wiersza poleceń:

npm config ls -l

Powinien dać dane wyjściowe zarówno dla twojej własnej konfiguracji lokalnej, jak i dla globalnej konfiguracji npm, a powinieneś zobaczyć swoją lokalną konfigurację prefiksów odzwierciedloną, prawdopodobnie u góry długiej listy wyników.

Ze względów bezpieczeństwa zalecam to podejście do konfigurowania zachowania npm konta użytkownika w przypadku chowningu /usr/localfolderów, które widziałem w innym miejscu.

Ryan
źródło
9

Na przykład w systemie Windows 7 można użyć następującego zestawu poleceń / operacji.

Utwórz osobistą zmienną środowiskową, podwójne ukośniki odwrotne są obowiązkowe:

  • Nazwa zmiennej: %NPM_HOME%
  • Wartość zmienna: C:\\SomeFolder\\SubFolder\\

Teraz ustaw wartości konfiguracyjne na nowe foldery (przykładowe nazwy plików):

  • Ustaw folder npm

npm config set prefix "%NPM_HOME%\\npm"

  • Ustaw folder npm-cache

npm config set cache "%NPM_HOME%\\npm-cache"

  • Ustaw folder tymczasowy npm

npm config set tmp "%NPM_HOME%\\temp"

Opcjonalnie możesz wyczyścić zawartość oryginalnych folderów przed zmianą konfiguracji.

  • Usuń plik npm-cache npm cache clear

  • Wymień moduły npm npm -g ls

  • Usuń moduły npm npm -g rm name_of_package1 name_of_package2

MichaelHuelsen
źródło
1
Dzięki, postępuję zgodnie z instrukcjami. Ale tworzy katalog o nazwie c: /% NPM_HOME% / npm itp. Zamiast c: / npm_home / npm
Jay
6

Po tym, jak sam tego szukałem, chcąc, aby kilka projektów ze współdzielonymi zależnościami było DRYer, znalazłem:

  • Instalacja lokalna jest sposobem Node na wszystko, z czego chcesz korzystać require()
  • Instalacja globalna dotyczy plików binarnych, które chcesz na swojej ścieżce, ale nie jest przeznaczona do niczego za pośrednictwem require()
  • Używanie przedrostka oznacza, że ​​musisz dodać odpowiednie bini manścieżki do$PATH
  • npm link( informacje ) pozwala na użycie lokalnej instalacji jako źródła globalnych

→ trzymaj się metody Node i zainstaluj lokalnie

ref:

Oli Studholme
źródło