Comment installer npm dans un répertoire spécifié?

Réponses:

325

Vous pouvez utiliser l' --prefixoption:

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

Le ou les packages seront ensuite installés dans ./install/here/node_modules. Le mkdirest nécessaire car npm pourrait sinon choisir un node_modulesrépertoire déjà existant plus haut dans la hiérarchie. (Voir la documentation npm sur les dossiers .)

coudy
la source
65
Il semble que vous devez avoir le fichier package.json dans ce répertoire alternatif si vous utilisez l'option --prefix. Existe-t-il un moyen d'avoir package.json dans le répertoire courant et de l'installer dans le répertoire alternatif?
2
@fractal Voir ma réponse pour cela
yunzen
10
@coundy Existe-t-il un moyen de spécifier le chemin d'accès npm install(sans nom de package)? J'ai tiré cela directement, mais alors npm cherche package.jsondans le {prefix}. Ce que je vise aussi, c'est de pouvoir laisser le packages.jsondans la racine du projet et en même temps installer tous les packages dans {project root}/{project webroot}.
automatix
J'ai rencontré un problème de récursivité. Existe-t-il un moyen de lui dire de s'exécuter une fois? Je l'ai résolu temporairement en changeant de répertoire puis en appelant npm install, mais cela --prefixsemble être une meilleure solution, si cela ne provoquait pas une récursivité.
adi518
47

Dans la documentation, il est indiqué: Utilisez l'option préfixe avec l'option globale :

La configuration par défaut du préfixe est l'emplacement où le nœud est installé. Sur la plupart des systèmes, il s'agit de / usr / local . Sous Windows, il s'agit de l'emplacement exact du binaire node.exe. Sur les systèmes Unix, c'est un niveau supérieur, car le nœud est généralement installé dans {prefix} / bin / node plutôt que {prefix} /node.exe .

Lorsque l' indicateur global est défini, npm installe des éléments dans ce préfixe. Lorsqu'il n'est pas défini, il utilise la racine du package actuel ou le répertoire de travail actuel s'il ne se trouve pas déjà dans un package.

(Souligné par eux)

Donc, dans votre répertoire racine, vous pouvez installer avec

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

et il installera le node_modulesdossier dans le dossier

<path/to/prefix_folder>/lib/node_modules
yunzen
la source
2
Vous ne pouvez pas requireinstaller les packages globalement, n'est-ce pas?
Pavlo
3
@Pavlo Est-ce que cela aide? stackoverflow.com/questions/15636367/…
yunzen
1
Vous devez ajouter ceci à la réponse.
Pavlo
6
@Pavlo Je ne pense pas. Ce n'est pas la réponse au PO.
2015
@Pavlo Si un package est installé globalement, vous en avez besoin de la même manière que d'habitude. Donc, oui, vous pouvez avoir besoin d'un package installé globalement.
Rob Evans
43

Depuis la version 3.8.6 de npm, vous pouvez utiliser

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

à installer dans le répertoire spécifié. NPM crée automatiquement un node_modulesdossier même lorsqu'un node_modulesrépertoire existe déjà dans la hiérarchie supérieure. Vous pouvez également avoir un package.jsondans le répertoire en cours, puis l'installer dans le répertoire spécifié en utilisant l' --prefixoption:

npm install --prefix ./install/here

Depuis npm 6.0.0, vous pouvez utiliser

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

pour installer le package.json dans le répertoire courant vers le répertoire "./install/here". Il y a une chose que j'ai remarqué sur Mac: cela crée un lien symbolique vers le dossier parent dans le répertoire node_modules. Mais cela fonctionne toujours.

REMARQUE: NPM honore le chemin que vous avez spécifié via l' --prefixoption. Il se résout selon la documentation npm sur les dossiers , uniquement lorsqu'il npm installest utilisé sans l' --prefixoption.

Rohit Sharma
la source
1
Cela ne semble pas fonctionner, je reçois toujoursCan't install <current directory>: Missing package name
Tibor Blenessy
1
@TiborBlenessy En supposant que vous parlez de la deuxième déclaration d'installation. Veuillez vous assurer que vous disposez d'un fichier package.json valide dans votre répertoire actuel. Si cela ne fonctionne toujours pas, faites-moi savoir votre version npm. Ces étapes fonctionnaient avec la version npm spécifiée. Et s'ils ne le font plus, j'aimerais plonger profondément et aller à la cause profonde et peut-être que je peux trouver une alternative.
Rohit Sharma
1
@RohitSharma En utilisant npm 6.0.0, cette méthode ne fonctionne pas car elle attend le package.jsonfichier dans./install/here
Christian Ivicevic
@ChristianIvicevic Vous pouvez utiliser npm install --prefix ./install/here ./ pour installer le package.json dans le répertoire en cours vers le répertoire "./install/here". Il y a une chose que j'ai remarqué sur Mac: cela crée un lien symbolique vers le dossier parent dans le répertoire node_modules. Mais, cela fonctionne toujours avec npm 6.0.0
Rohit Sharma
1
@Tanoro La troisième commande fonctionnera avec npm 6.0.0 avec la création de liens symboliques comme mentionné dans la réponse. Je n'ai jamais essayé les 2 premières commandes avec npm v3.5.2, c'est pourquoi j'ai mentionné la version spécifique de npm avec laquelle j'avais essayé. N'hésitez pas à mettre à jour la réponse avec des commandes de travail pour d'autres versions également.
Rohit Sharma
0

J'utilise une version PowerShell et je n'ai pas pu exécuter npm sans changer le répertoire courant.

J'ai fini par utiliser la commande start et en spécifiant simplement le répertoire de travail:

start "npm" -ArgumentList "install --warn" -wo $buildFolder
Malachy
la source