Comment empêchez-vous l'installation de modules NPM «devDependencies» pour Node.js (package.json)?

588

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"
  }
}

J'utilise la version 1.1.1 de NPM sur Mac 10.6.8.

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

npm install

J'avais l'impression que cette commande avait installé devDependencies:

npm install --dev

Comment puis-je faire en sorte npm installque seules les installations dependencies(donc l'environnement de production n'obtient que ces modules), alors que quelque chose comme npm install --devinstalle les deux dependencieset devDependencies?

Lance Pollard
la source
1
Selon le doc, vous avez raison, le --dev installe les devdeps, sinon, seulement les deps. npmjs.org/doc/json.html . Je sais que cela fonctionne pour les packages nommés, au moins.
mna
1
si vous rencontrez cette question en 2015, le commutateur --save-dev fait exactement l'affaire comme demandé dans cette question.
Anand
1
Cette réponse stackoverflow.com/a/22004559/3718119 donne une belle explication des différences entre dependencieset devDependencieset quand chacun d'eux est utilisé.
quasoft

Réponses:

844

La npm installcommande installera le devDependencieslong de l'autre dependencieslorsqu'elle est exécutée dans un répertoire de package, dans un environnement de développement (par défaut).

Utilisez npm install --only=prod(ou --only=production) pour installer uniquement dependencies , et non devDependencies,quelle que soit la valeur de la NODE_ENVvariable d'environnement.

Source: npm docs

Remarque: Avant la v3.3.0 de npm (2015-08-13), l'option était appelée --production, c'est-à-dire npm install --production.

Rohan Singh
la source
2
Le raisonnement d'Agate est probablement de supprimer devDependencies afin que les consommateurs qui installent votre package avec npm install yourpackage.tgzn'obtiennent pas également les devDependencies. Mais c'est déjà le cas. Voir la réponse de Kevin Cox ci-dessous ( stackoverflow.com/a/15826602/825588 ).
Johann
5
npmjs.org/doc/cli/npm-install.html "Par défaut, npm install installera tous les modules répertoriés comme dépendances. Avec l'indicateur --production, npm n'installera pas les modules répertoriés dans devDependencies."
tomByrer
14
Oh mon Dieu. J'avais totalement NODE_ENV=productionde quelque chose d'autre que je faisais et ne pouvais pas comprendre pour la vie de moi pourquoi npm installne pas installer de dépendances. Merci pour la réponse complète.
aendrew
1
npm install --dev installerait uniquement les dépendances de développement
Rustem K
10
Pour npm 3.3 et versions ultérieures: npm WARN install L'utilisation de l' --devoption est déconseillée. Utilisez --only=devplutôt.
srcspider
232

Je rencontre aussi ce problème! L'installation de npm est quelque peu déroutante et les publications Web continuent d'introduire les indicateurs -d / - dev comme s'il y avait un mode d'installation explicite de «développement».

  • npm installva installer les " dépendances " et " devDependencies "

  • npm install --productionn'installera que des " dépendances "

  • npm install --devinstallera uniquement " devDependencies "

smertrios
la source
29
AVERTISSEMENT: si NODE_ENVest défini sur productionet que vous l'exécutez, npm installil n'installera pas les dépendances de développement. J'ai rencontré ce problème dans mon Dockerfile.
vaughan
1
@vaughan J'ai également rencontré cela, peut être résolu en exécutant npm --production=false install(mais je ne sais pas si cela fonctionnera avec le drapeau --dev)
Bavell
138

La nouvelle option est:

npm install --only=prod

Si vous souhaitez installer uniquement devDependencies:

npm install --only=dev
Cloxure
la source
1
Cela répond à l'opposé de la question. OP demande comment NE PAS installer devDependencies.
musicin3d
2
vous avez partiellement raison @ musicin3d, c'est pourquoi dans la première partie j'ai répondu comment installer les dépendances prod uniquement et dans la deuxième partie comment installer les dépendances dev uniquement, juste au cas où.
Cloxure
5
Héy. J'ai laissé ce commentaire avant que @ user1614572 ait ajouté la partie sur --only=prod. Vous, monsieur, vous avez partiellement raison. ; P
musicin3d
pouvons-nous inclure une dépendance distincte pour le déploiement?
Jeeva Jsb
1
C'est un commentaire, pas une réponse. Je ne vérifie pas tous mes commentaires périodiquement. Je n'ai jamais vu de gens mettre à jour les commentaires d'il y a des années. Vous êtes essentiellement venu ici pour critiquer le fait que j'ai mis un an à mon commentaire. Je ne répondrai plus. Amusez-vous à traîner les autres.
Jacques ジ ャ ッ ク
47

Si vous avez lu ce POST en 2016, veuillez réaliser ce que vous voulez en utilisant

--only={prod[uction]|dev[elopment]} 

L'argument entraînera soit uniquement les devDependencies, soit uniquement les non-devDependencies à installer, quel que soit le NODE_ENV.

à partir de: https://docs.npmjs.com/cli/install

wzr1337
la source
Pourquoi capitaliser "POST"? docs.npmjs.com/cli/install documente clairement LES DEUX --productionet --only={prod[uction]|dev[elopment]}.
Dan Dascalescu
33

Si vous avez déjà installé toutes vos dépendances et que vous souhaitez éviter d'avoir à télécharger à nouveau vos packages de production à partir de NPM, vous pouvez simplement taper:

npm prune --production

Cela supprimera vos dépendances dev de votre node_modulesdossier, ce qui est utile si vous essayez d'automatiser un processus en deux étapes comme

  1. Webpack mon projet, en utilisant les dépendances dev
  2. Créez une image Docker en utilisant uniquement des modules de production

Courir npm pruneentre les deux vous évitera de devoir tout réinstaller!

piercebot
la source
19

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

Le but de la différence entre les dépendances / devDependencies / optionalDependencies est ce que les consommateurs de votre code peuvent faire w / npm pour installer ces ressources.

Selon la documentation: https://npmjs.org/doc/json.html ...

Si quelqu'un prévoit de télécharger et d'utiliser votre module dans son programme, il ne veut probablement pas ou n'a pas besoin de télécharger et de créer le cadre de test ou de documentation externe que vous utilisez.

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

Ces éléments seront installés chaque fois que l'indicateur de configuration --dev est défini. Cet indicateur est défini automatiquement lors de la liaison npm ou lors de l'installation npm à partir de la racine d'un package, et peut être géré comme tout autre paramètre de configuration npm. Voir config (1) pour plus d'informations sur le sujet.

Cependant, pour résoudre cette question, si vous souhaitez installer UNIQUEMENT les "dépendances" à l'aide de npm, la commande suivante est:

npm install --production

Cela peut être confirmé en consultant le commit Git qui a ajouté ce filtre (ainsi que d'autres filtres [répertoriés ci-dessous] pour fournir cette fonctionnalité).

Filtres alternatifs utilisables par npm:

--save          => updates dependencies entries in the {{{json}}} file
--force         => force fetching remote entries if they exist on disk 
--force-latest  => force latest version on conflict
--production    => do NOT install project devDependencies
--no-color      => do not print colors

@dmarr essayez d'utiliser npm install --production

creatovisguru
la source
16

npm installera les dépendances dev lors de l'installation depuis l'intérieur d'un paquet (s'il y en a un package.jsondans le répertoire courant). S'il provient d'un autre emplacement (registre npm, git repo, emplacement différent sur le système de fichiers), il installe uniquement les dépendances.

Kevin Cox
la source
Pourriez-vous reformuler? Je pense que vous avez fait une erreur dans vos parenthèses, je pense que vous avez oublié de la fermer plus tôt et votre frase n'a pas beaucoup de sens pour moi (anglophone non natif). Le commentaire de Johann sous la réponse de Rohan Singh m'a amené à regarder votre réponse (parce que mon doute était exactement le même que celui de l'agate), et sans succès. Je ne comprends toujours pas comment npm install some-modulen'installera pas les dépendances de dev de some-module.
Rafael Eyng
Merci, réparé. Je ne comprends cependant pas le reste de votre question.
Kevin Cox
3

J'ai constaté que, lorsque vous essayez d'installer des dépendances dev pour un package qui contient un addon de nœud, vous ne pouvez pas éviter de construire l'addon lors de l'exécution de npm install --dev même si vous voulez simplement installer les devDependencies. J'ai donc dû faire le tour du npm:

node -e 'console.log( Object.keys( require( "./package.json" ).devDependencies ) );' | \
sed  -e "s/^[^']*'//" -e "s/'.*$//" | \
xargs npm install

Ou, mieux (et plus succinctement) encore,

node -e 'Object.keys( require( "./package.json" ).devDependencies )
.map( function( item ){ console.log( item ) } );' | xargs npm install
Gabriel Schulhof
la source
3

Utiliser npm install packageName --savececi ajoutera un package dans les dépendances , si vous l'utilisez, npm install packageName --save-devil devDependencies .

npm install packageName --save-devdoit être utilisé pour ajouter des packages à des fins de développement. Comme l'ajout de packages TDD (Chai, mocha, etc.). Qui sont utilisés dans le développement et non dans la production.

Sandip Nirmal
la source
L'OP ne rencontre pas de problème lors de l'enregistrement des dépendances package.jsonmais une fois que ces dépendances sont déjà enregistrées , alors comment contraindre npmà n'installer qu'un seul type spécifique de dépendance. Lorsque j'ai lu votre réponse ici, je n'ai rien appris qui puisse résoudre le problème posé par le PO.
Louis
3

Il convient de mentionner que vous pouvez utiliser la NODE_ENVvariable d'environnement pour obtenir le même résultat. Particulièrement utile si vous conteneurisez votre application Node (par exemple Docker).

NODE_ENV=production npm install

Le code ci-dessus installera toutes vos dépendances sauf celles de développement (ie devDependencies).

si vous avez besoin d'utiliser des variables d'environnement dans votre Dockerfileplus d'informations peuvent être trouvées ici .

Les variables d'environnement sont faciles à remplacer en cas de besoin (par exemple, si vous souhaitez exécuter votre suite de tests, par exemple sur Travis CI). Si tel était le cas, vous pourriez faire quelque chose comme ceci:

docker run -v $(pwd):/usr/src/app --rm -it -e NODE_ENV=production node:8 npm install

Documentation NPM ici

production

  • Par défaut: faux
  • Type: Boolean Défini sur true pour s'exécuter en mode "production".

    1. devDependencies ne sont pas installés au plus haut niveau lors de l'exécution de l'installation locale de npm sans aucun argument.
    2. Définissez NODE_ENV = "production" pour les scripts de cycle de vie.

Conteneurisation heureuse =)

Francesco Casula
la source
3

Je suggère d'utiliser npm ci. Si vous souhaitez installer uniquement les packages nécessaires à la production (comme vous l'avez écrit - sans devDependencies), alors:

npm ci --only=production

ou

NODE_ENV=production npm ci

Si vous préférez oldschool npm installalors:

npm install --production

ou

NODE_ENV=production npm install

Voici une bonne réponse pourquoi vous devriez utiliser npm ci.

marverix
la source
Cool, ça marche npm ciaussi, pas seulement npm install!
Klesun
2

Besoin d'ajouter à la réponse choisie: À partir de maintenant, npm installdans un répertoire de package (contenant package.json) va installer devDependencies, alors que npm install -gne les installera pas.

ack
la source
7
Oui, -gne s'installera pas devDependencies, mais il installe les packages globalement, ce qui n'est souvent pas le résultat souhaité.
Bardi Harborow
0

npm install --productionest la bonne façon d'installer les modules de nœuds nécessaires à la production. Consultez la documentation pour plus de détails

Rubin bhandari
la source
-1

Maintenant, il y a un problème, si vous avez package-lock.json avec npm 5+. Vous devez le retirer avant utilisation de npm install --production.

Erich Stark
la source
-1
npm install --dev will install dev dependencies

Et, conformément à la question pour installer uniquement les dépendances, la commande suivante vous aidera

npm install --prod will install dependencies
karthiks416
la source