Comment définir un emplacement personnalisé pour l'installation locale du package npm?

177

Est-il possible de spécifier une destination de package personnalisée pour npm install, via un indicateur de commande ou une variable d'environnement?

Par défaut, les installations locales de npm se terminent node_modulesdans le répertoire actuel, mais je veux qu'il s'installe dans node_modulesun répertoire différent, par exemple vendor/node_modules. Comment puis-je y arriver?

pje
la source
Qu'est-ce que vous essayez d'accomplir? cela a été discuté ici: stackoverflow.com/questions/13668097/…
Pascal Belloncle
10
@PascalBelloncle: Au lieu d'installer des packages dans des sous-répertoires de ./node_modules, je veux que npm les installe dans les sous-répertoires de ./vendor/node_modules. (Ou se faire dire que ce n'est pas configurable.)
pje
1
J'ai compris que c'était ce que vous vouliez faire, ce que je ne pense pas être possible dès le départ. De plus, exiger ne fonctionnerait pas non plus. Alors je vous demandais pourquoi vous vouliez faire ça. Il existe peut-être une solution alternative pour faire ce que vous voulez.
Pascal Belloncle
1
J'installe un paquet uniquement pour son binaire (c'est-à-dire qu'il ne sera utilisé que sur la ligne de commande et jamais required) mais je ne veux pas l'installer globalement.
pje
Je vois. Voir ma suggestion ci-dessous alors.
Pascal Belloncle

Réponses:

180

TL; DR

Vous pouvez le faire en utilisant l' --prefixindicateur et l' --globalindicateur *.

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

* Même s'il s'agit d'une installation "globale", les chutiers installés ne seront pas accessibles via la ligne de commande sauf s'ils ~/foo/vendor/node_modulesexistent dans PATH.

TL; R

Chaque attribut configurable de npmpeut être défini dans l'un des six emplacements différents. Par ordre de priorité:

  • Drapeaux de ligne de commande: --prefix ./vendor/node_modules
  • Variables d'environnement: NPM_CONFIG_PREFIX=./vendor/node_modules
  • Fichier de configuration utilisateur: $HOME/.npmrcou userconfigparam
  • Fichier de configuration globale: $PREFIX/etc/npmrcou userconfigparam
  • Fichier de configuration intégré: path/to/npm/itself/npmrc
  • Configuration par défaut: node_modules / npmconf / config-defs.js

Par défaut, les packages installés localement vont dans ./node_modules. les globales vont dans la prefixvariable de configuration ( /usr/localpar défaut).

Vous pouvez exécuter npm config listpour voir votre configuration actuelle et la npm config editmodifier.

PS

En général, npmla documentation de est vraiment utile. La section des dossiers est un bon aperçu structurel de npm et la section de configuration répond à cette question.

pje
la source
2
Pendant que je teste, en fait, si vous suivez la commande ci-dessus, il sera installé en ./vendor/node_modules/lib/bowerutilisantnpm#3.8.0
e-cloud
2
En faisant cela, No version provided in package.json
j'obtiens une
Vous écrivez bins won't be accessible through the command line. Le programme peut bien sûr être appelé en utilisant le chemin complet npm install [email protected] -g --prefix c:\my_npm` calling c: \ my_npm \ eslint --fix my.js`
Bernhard Döbler
13
Est-il possible de réaliser quelque chose de similaire avec un fichier package.json? c'est-à-dire que si je cours npm installdans le répertoire A avec le fichier package.json, les packages seront installés dans le répertoire B. Il semble que cette solution concerne les packages individuels en cours d'installation.
Ryan-Neal Mes
1
Existe-t-il un moyen d'installer toutes les dépendances à l'aide de cette méthode? npm installinstalle les dépendances localement. npm install X -g -prefix "..."installe le module X sur le préfixe, npm install -g -prefix "..."installe le package actuel sur le préfixe.
AnnanFay
28

Si vous voulez cela dans la configuration, vous pouvez définir la configuration de npm comme suit:

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

ou

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

Vérifiez votre configuration avec

npm config ls -l

Ou comme @pje le dit et utilisez le --prefixdrapeau

Rimian
la source
4
Je crois que cela définit le préfixe global? Cela npm installinstallera toujours localement ./node_modulesmais npm install -ginstallera sur "$(pwd)/vendor/node_modules". Je peux imaginer les paramètres en l'oubliant puis en revenant plus tard en me demandant pourquoi mes packages globaux agissent bizarrement.
AnnanFay
13

Pour OSX, vous pouvez accéder à votre utilisateur $HOME(probablement / Users / yourname /) et, s'il n'existe pas déjà, créer un .npmrcfichier (un fichier que npm utilise pour la configuration de l'utilisateur) et créer un répertoire pour vos packages npm pour être installé dans (par exemple, / Users / yourname / npm). Dans ce fichier .npmrc, définissez "prefix" sur votre nouveau répertoire npm, qui sera l'endroit où les packages npm installés "globalement" seront installés; ces packages "globaux" ne seront évidemment disponibles que sur votre compte utilisateur.

Dans .npmrc:

prefix=${HOME}/npm

Ensuite, exécutez cette commande à partir de la ligne de commande:

npm config ls -l

Il devrait donner une sortie à la fois sur votre propre configuration locale et sur la configuration globale de npm, et vous devriez voir votre configuration de préfixe local reflétée, probablement vers le haut de la longue liste de sortie.

Pour des raisons de sécurité, je recommande cette approche pour configurer le comportement npm de votre compte d'utilisateur sur la configuration de vos /usr/localdossiers, ce que j'ai vu recommandé ailleurs.

Ryan
la source
9

Sur Windows 7 par exemple, l'ensemble de commandes / opérations suivant peut être utilisé.

Créez une variable d'environnement personnelle, les doubles barres obliques inverses sont obligatoires:

  • Nom de variable: %NPM_HOME%
  • Valeur variable: C:\\SomeFolder\\SubFolder\\

Maintenant, définissez les valeurs de configuration sur les nouveaux dossiers (exemples de noms de fichiers):

  • Définir le dossier npm

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

  • Définissez le dossier npm-cache

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

  • Définir le dossier temporaire npm

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

Vous pouvez éventuellement purger le contenu des dossiers d'origine avant que la configuration ne soit modifiée.

  • Supprimer le npm-cache npm cache clear

  • Lister les modules npm npm -g ls

  • Supprimer les modules npm npm -g rm name_of_package1 name_of_package2

MichaelHuelsen
la source
1
Merci, je suis les étapes. Mais il crée un répertoire appelé c: /% NPM_HOME% / npm, etc. au lieu de c: / npm_home / npm
Jay
6

Après avoir cherché cela moi-même en voulant que plusieurs projets avec des dépendances partagées soient DRYer, j'ai trouvé:

  • L'installation localement est le moyen Node pour tout ce que vous souhaitez utiliser via require()
  • L'installation globale est pour les binaires que vous voulez dans votre chemin, mais n'est destinée à rien via require()
  • L'utilisation d'un préfixe signifie que vous devez ajouter des chemins appropriés binet manvers$PATH
  • npm link( info ) vous permet d'utiliser une installation locale comme source pour les globaux

→ s'en tenir à la méthode Node et installer localement

réf:

Oli Studholme
la source