733 votes

Comment empêcher l'installation des modules "devDependencies" NPM pour Node.js (package.json) ?

J'ai ceci dans mon fichier package.json (version raccourcie) :

{
  "name": "a-module",
  "version": "0.0.1",
  "dependencies": {
    "coffee-script":      ">= 1.1.3"
  },
  "devDependencies": {
    "stylus":             ">= 0.17.0"
  }
}

Je suis en train d'utiliser la version NPM 1.1.1 sur Mac 10.6.8.

Lorsque j'exécute la commande suivante à partir de la racine du projet, elle installe à la fois les dependencies et les devDependencies:

npm install

J'avais l'impression que cette commande installait les devDependencies :

npm install --dev

Comment puis-je faire en sorte que npm install n'installe que les dependencies (afin que l'environnement de production ne reçoive que ces modules), tandis que quelque chose comme npm install --dev installe à la fois les dependencies et les devDependencies ?

1 votes

Selon le doc, vous avez raison, le --dev installe les devdeps, sinon, seules les deps. npmjs.org/doc/json.html. Je sais que cela fonctionne pour les packages nommés, du moins.

2 votes

Si vous tombez sur cette question en 2015, l'option --save-dev fait exactement ce qui est demandé dans cette question.

2 votes

Cette réponse stackoverflow.com/a/22004559/3718119 donne une bonne explication des différences entre dependencies et devDependencies et quand chacun est utilisé.

1104voto

Rohan Singh Points 4213

La commande npm install installera les devDependencies ainsi que les autres dépendances lorsqu'elle est exécutée à l'intérieur d'un répertoire de package, dans un environnement de développement (par défaut).

Dans la version 8.x et supérieure, utilisez le drapeau --omit=dev pour installer uniquement les dépendances régulières:

npm install --omit=dev

Ceci installera uniquement les dépendances, et non les devDependencies, quel que soit la valeur de la variable d'environnement NODE_ENV.

Si vous utilisez la version 6.x ou une version antérieure, vous devez utiliser le drapeau --only=prod à la place.

Note:
Avant la version v3.3.0 de npm (2015-08-13), l'option s'appelait --production, c'est-à-dire.

npm install --production

Vous pourriez également avoir besoin du drapeau --no-optional.

0 votes

Donc si nous publions un module. Devons-nous supprimer les devDependencies de package.json?

4 votes

La raison d'Agate est probablement de supprimer les devDependencies afin que les consommateurs installant votre package avec npm install yourpackage.tgz ne récupèrent pas également les devDependencies. Cependant, c'est déjà le cas. Voir la réponse de Kevin Cox ci-dessous (stackoverflow.com/a/15826602/825588).

7 votes

npmjs.org/doc/cli/npm-install.html "Par défaut, npm installera tous les modules répertoriés comme dépendances. Avec le drapeau --production, npm n'installera pas les modules répertoriés dans devDependencies."

276voto

smertrios Points 456

Je rencontre aussi ce problème! npm install est quelque peu déroutant et les articles sur le web continuent de mentionner les drapeaux -d/--dev comme s'il y avait un mode d'installation explicite pour le développement.

  • npm install installera à la fois les "dépendances" et les "devDependencies"

  • npm install --production installera uniquement les "dépendances"

  • npm install --dev installera uniquement les "devDependencies"

45 votes

ATTENTION : Si NODE_ENV est défini sur production et que vous exécutez npm install, les dépendances de développement ne seront pas installées. J'ai rencontré ce problème dans mon Dockerfile.

5 votes

@vaughan J'ai également rencontré ce problème, qui peut être résolu en exécutant npm --production=false install (bien que je ne sois pas sûr que cela fonctionnera avec le drapeau --dev).

0 votes

@vaughan que se passe-t-il si echo $NODE_ENV renvoie vide?

22voto

creatovisguru Points 151

Lorsque vous utilisez "npm install", les modules sont chargés et disponibles dans toute votre application, qu'ils soient des "devDependencies" ou des "dependencies". L'idée principale est que tout ce que votre package.json définit comme une dépendance (quel que soit le type) est installé dans node_modules.

La différence entre les dependencies/devDependencies/optionalDependencies réside dans ce que les consommateurs de votre code peuvent faire avec npm pour installer ces ressources.

Conformément à la documentation : https://npmjs.org/doc/json.html...

Si quelqu'un envisage de télécharger et d'utiliser votre module dans son programme, il ne voudra probablement pas télécharger et construire le framework de test ou de documentation externe que vous utilisez.

Dans ce cas, il est préférable de lister ces éléments supplémentaires dans un hash devDependencies.

Ces éléments seront installés chaque fois que le drapeau de configuration --dev est défini. Ce drapeau est défini automatiquement lors de l'exécution de npm link ou de npm install à la racine d'un package, et peut être géré comme tout autre paramètre de configuration npm. Consultez config(1) pour en savoir plus sur le sujet.

Cependant, pour résoudre cette question, si vous voulez INSTALLER UNIQUEMENT les "dependencies" en utilisant npm, la commande suivante est :

npm install --production

Cela peut être confirmé en examinant le commit Git qui a ajouté ce filtre (avec quelques autres filtres [énumérés ci-dessous] pour fournir cette fonctionnalité).

Autres filtres qui peuvent être utilisés avec npm :

--save          => met à jour les entrées des dépendances dans le fichier json
--force         => force le téléchargement des entrées distantes si elles existent sur le disque
--force-latest  => force la dernière version en cas de conflit
--production    => NE PAS installer les devDependencies du projet
--no-color      => n'affiche pas les couleurs

@dmarr essayez d'utiliser npm install --production

17voto

Kevin Cox Points 725

Npm installera les dépendances de développement lors de l'installation depuis l'intérieur d'un package (s'il y a un package.json dans le répertoire en cours). S'il provient d'un autre emplacement (registre npm, dépôt git, emplacement différent sur le système de fichiers), il n'installe que les dépendances.

0 votes

Pouvez-vous reformuler s'il vous plaît? Je pense que vous avez fait une erreur dans vos parenthèses, vous avez oublié de la fermer plus tôt et votre phrase n'a pas beaucoup de sens pour moi (anglais non natif). Le commentaire de Johann sous la réponse de Rohan Singh m'a incité à regarder votre réponse (car mon doute était exactement le même que le doute d'agate), et sans succès. Je ne comprends toujours pas pourquoi npm install some-module n'installera pas les dépendances de développement de some-module.

0 votes

Merci, c'est corrigé. Je ne comprends pas le reste de votre question cependant.

3voto

ack Points 582

Besoin d'ajouter à la réponse choisie : À l'heure actuelle, npm install dans un répertoire de package (contenant package.json) installera les devDependencies, alors que npm install -g ne les installera pas.

9 votes

Oui, -g n'installera pas les devDependencies, mais il installe les packages de manière globale, ce qui n'est souvent pas le résultat souhaité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X