Jak zainstalować npm w określonym katalogu?

Odpowiedzi:

325

Możesz użyć --prefixopcji:

mkdir -p ./install/here/node_modules
npm install --prefix ./install/here <package>

Pakiety zostaną wówczas zainstalowane ./install/here/node_modules. Jest mkdirto konieczne, ponieważ npm może w innym przypadku wybrać już istniejący node_moduleskatalog wyżej w hierarchii. (Zobacz dokumentację npm dotyczącą folderów .)

coudy
źródło
65
Wygląda na to, że musisz mieć plik package.json w tym alternatywnym katalogu, jeśli używasz opcji --prefix. Czy istnieje sposób, aby pakiet.json znalazł się w bieżącym katalogu i zainstalować w katalogu alternatywnym?
2
@fractal Zobacz moją odpowiedź na to
Junzen
10
@coundy Czy istnieje sposób na określenie ścieżki npm install(bez nazwy pakietu)? Sprawdziłem to bezpośrednio, ale potem npm szuka package.jsonw {prefix}. Moim celem jest również umożliwienie rootowi packages.jsonw projekcie rootowania i jednoczesne zainstalowanie wszystkich pakietów {project root}/{project webroot}.
automatix
Wystąpił problem z rekurencją. Czy jest sposób, aby powiedzieć, żeby uruchomił się raz? Rozwiązałem go tymczasowo, zmieniając katalog, a następnie dzwoniąc npm install, ale --prefixwydaje się, że jest to ładniejsze rozwiązanie, jeśli nie powoduje rekurencji.
adi518,
47

W dokumentacji jest powiedziane: Użyj opcji prefiksu razem z opcją globalną :

Prefiks config domyślne do miejsca, w którym jest zainstalowany węzeł. W większości systemów jest to / usr / local . W systemie Windows jest to dokładna lokalizacja pliku binarnego node.exe. W systemach Unix jest o jeden poziom wyżej, ponieważ węzeł jest zwykle instalowany w {prefix} / bin / node zamiast {prefix} /node.exe .

Po ustawieniu flagi globalnej npm instaluje różne rzeczy w tym prefiksie. Gdy nie jest ustawiony, korzysta z katalogu głównego bieżącego pakietu lub bieżącego katalogu roboczego, jeśli nie jest już w pakiecie.

(Nacisk przez nich)

Więc w swoim katalogu głównym możesz zainstalować

npm install --prefix <path/to/prefix_folder> -g

i zainstaluje node_modulesfolder w folderze

<path/to/prefix_folder>/lib/node_modules
Junzen
źródło
2
Nie możesz requireinstalować pakietów globalnie, prawda?
Pavlo,
3
@Pavlo Czy to pomaga? stackoverflow.com/questions/15636367/…
Junzen
1
Powinieneś dodać to do odpowiedzi.
Pavlo,
6
@Pavlo Nie sądzę. To nie jest odpowiedź na PO.
Junzen
@Pavlo Jeśli pakiet jest zainstalowany globalnie, potrzebujesz go w taki sam sposób, jak zawsze. Więc tak, możesz wymagać pakietu instalowanego globalnie.
Rob Evans,
43

Od wersji npm 3.8.6 możesz używać

npm install --prefix ./install/here <package>

zainstalować w określonym katalogu. NPM automatycznie tworzy node_modulesfolder, nawet jeśli node_moduleskatalog już istnieje w wyższej hierarchii. Możesz również mieć package.jsonw bieżącym katalogu, a następnie zainstalować go w określonym katalogu za pomocą --prefixopcji:

npm install --prefix ./install/here

Począwszy od npm 6.0.0, możesz używać

npm install --prefix ./install/here ./

aby zainstalować pakiet.json w bieżącym katalogu do katalogu „./install/here”. Jest jedna rzecz, którą zauważyłem na Macu, że tworzy ona dowiązanie symboliczne do folderu nadrzędnego w katalogu node_modules. Ale nadal działa.

UWAGA: NPM honoruje ścieżkę określoną przez --prefixopcję. Rozwiązuje się zgodnie z dokumentacją npm na folderach , tylko gdy npm installjest używany bez --prefixopcji.

Rohit Sharma
źródło
1
To nie wydaje się działać, zawsze rozumiemCan't install <current directory>: Missing package name
Tibor Blenessy
1
@TiborBlenessy Zakładając, że mówisz o drugiej instrukcji instalacji. Upewnij się, że masz poprawny plik package.json w bieżącym katalogu. Jeśli nadal nie działa, daj mi znać swoją wersję npm. Te kroki służyły do ​​pracy z określoną wersją npm. A jeśli już nie będą, chciałbym zanurkować głęboko i dotrzeć do pierwotnej przyczyny i być może uda mi się wymyślić alternatywę.
Rohit Sharma
1
@RohitSharma Przy użyciu npm 6.0.0 ta metoda nie działa, ponieważ oczekuje package.jsonpliku w./install/here
Christian Ivicevic 30.04.18
@ChristianIvicevic Możesz użyć npm install --prefix ./install/here ./, aby zainstalować pakiet.json w bieżącym katalogu do katalogu „./install/here”. Jest jedna rzecz, którą zauważyłem na Macu, że tworzy ona dowiązanie symboliczne do folderu nadrzędnego w katalogu node_modules. Ale nadal działa z npm 6.0.0
Rohit Sharma
1
@Tanoro Trzecie polecenie będzie działać z npm 6.0.0 z tworzeniem dowiązań symbolicznych, jak wspomniano w odpowiedzi. Nigdy nie próbowałem pierwszych 2 poleceń z npm v3.5.2, dlatego wspomniałem o konkretnej wersji npm, z którą próbowałem. Zaktualizuj odpowiedź działającymi poleceniami również dla innych wersji.
Rohit Sharma
0

Korzystam z kompilacji PowerShell i nie mogłem uruchomić npm bez zmiany bieżącego katalogu.

Skończyło się na użyciu komendy start i po prostu określeniu katalogu roboczego:

start "npm" -ArgumentList "install --warn" -wo $buildFolder
Malachy
źródło