Quelle est la difference entre --save et --save-dev?

747

Quelle est la différence entre:

npm install [package_name] --save

et:

npm install [package_name] --save-dev

Qu'est-ce que ça veut dire?

nfort
la source
4
oui, je suis confus à ce sujet - si vous utilisez une intégration continue comme Jenkins, Jenkins sait-il utiliser les modules devDependencies pour exécuter des tests? Je suppose que oui, mais ce n'est pas super évident.
Alexander Mills
5
éditez peut-être la question pour dire aussi, quelle est la différence fonctionnelle entre les dépendances et devDependencies?
Alexander Mills
5
Les packages installés via l'option --save-dev ne sont pas réinstallés lorsque l'utilisateur s'exécute npm install --production. C'est la différence opérationnelle (voir https://docs.npmjs.com/cli/install pour plus d'informations).
Andrew
7
@MuhammadUmer C'est précisément la raison pour laquelle les gens posent des questions ici - afin de «se faire une idée». Peut-être que l'ajout d'une vraie réponse serait plus productif - c'est certainement une distinction intéressante que je n'étais pas au courant.
Simon_Weaver
3
également si vous définissez la variable d'environnement NODE_ENVsur production, npm installexclut automatiquement les packages de développement.
Muhammad Umer

Réponses:

591
  • --save-devest utilisé pour enregistrer le package à des fins de développement. Exemple: tests unitaires, minification ..
  • --save est utilisé pour enregistrer le package requis pour l'exécution de l'application.
Tuong Le
la source
150
Comment sont-ils différents? Quand utiliserais-je l'un contre l'autre? Puis-je quand même utiliser le package en production s'il est sous --save-dev?
Dave Voyles du
14
La réponse répond succinctement à vos deux premières questions. La réponse à la dernière question, "Puis-je encore utiliser le package en production s'il est sous --save-dev", est "non". Bien qu'il soit certainement possible de le faire, ce n'est pas prévu.
Technetium
61
Versions -Draccourcies : est l'abréviation de --save-devet -Sest l'abréviation de--save
chrisco
164
Cette réponse est d'une vague frustrante. Même un petit exemple contribuerait grandement à rendre cela plus clair.
Choylton B. Higginbottom
33
Notez qu'à partir de la version 5.0.0 de npm, l' --saveoption n'est plus nécessaire. Si vous le faites npm install my-package, il ajoutera "mon-package" comme dépendance dans le fichier package.json.
Martin Carel
644

La différence entre --saveet --save-devpeut ne pas être immédiatement perceptible si vous les avez essayés tous les deux sur vos propres projets. Voici donc quelques exemples ...

Supposons que vous construisiez une application qui utilisait le package moment pour analyser et afficher les dates. Votre application est un planificateur, elle a donc vraiment besoin de ce package pour fonctionner, comme dans: ne peut pas fonctionner sans lui . Dans ce cas, vous utiliseriez

npm install moment --save

Cela créerait une nouvelle valeur dans votre package.json

"dependencies": {
   ...
   "moment": "^2.17.1"
}

Lorsque vous développez, cela aide vraiment d'utiliser des outils tels que des suites de tests et peut avoir besoin de jasmine-core et de karma . Dans ce cas, vous utiliseriez

npm install jasmine-core --save-dev
npm install karma --save-dev

Cela créerait également une nouvelle valeur dans votre package.json

"devDependencies": {
    ...
    "jasmine-core": "^2.5.2",
    "karma": "^1.4.1",
}

Vous n'avez pas besoin de la suite de tests pour exécuter l'application dans son état normal, c'est donc une --save-devdépendance de type, rien de plus. Vous pouvez voir comment, si vous ne comprenez pas ce qui se passe réellement, c'est un peu difficile à imaginer.

Extrait directement de NPM docs docs # dependencies

Dépendances

Les dépendances sont spécifiées dans un objet simple qui mappe un nom de package à une plage de versions. La plage de versions est une chaîne qui a un ou plusieurs descripteurs séparés par des espaces. Les dépendances peuvent également être identifiées par une URL tarball ou git.

Veuillez ne pas mettre de faisceaux de test ou de transpilateurs dans votre objet de dépendances. Voir devDependencies , ci-dessous.

Même dans la documentation, il vous demande d'utiliser --save-dev pour les modules tels que les faisceaux de test.

J'espère que cela aide et est clair.

Michael Bruce
la source
15
OMI, je pense que le mot-clé «enregistrer» est un problème. Pourquoi ne font-ils pas le drapeau -dev pour développer et -deploy pour le déploiement. Il est plus logique que de sauvegarder le mot-clé.
Thinh Vu
1
Pourquoi le package ne sait-il pas (décider) s'il s'agit d'un package de version ou d'un package de développement et --save doit être utilisé pour les deux. Cela semble étrange de faire en sorte que l'utilisateur installateur décide de cela, lorsque le développeur du package crée l'intention.
CodeGrue
4
CodeGrue, si vous utilisez jQuery uniquement pour tester les composants React, il ira dans save-dev, mais vous ne pourrez pas réellement l'utiliser pour construire votre projet principal. Oui, c'est possible. Alors pourquoi le conditionneur sait-il ce que vous en faites?
Michael Bruce
2
Beaucoup plus clair. Je suis un gars intégré qui apprend le workflow Bootstra + Node.js pour la première fois. Ce n'est pas évident quelle est la différence.
Leroy105
3
@YakovL save-dev signifie que les packages ne sont pas installés lorsque quelqu'un d'autre installe votre package en tant que dépendance. Les packages qui ne sont utilisés que pour exécuter des scripts tels que start / build ne seront pas nécessaires dans ce cas, ils sont donc placés dans des dépendances de développement. Si vous travaillez sur une application Web et non sur un package à utiliser par d'autres, vous ne devriez probablement pas vous en soucier du tout.
riv
113

Par défaut, NPM installe simplement un package sous node_modules. Lorsque vous essayez d'installer des dépendances pour votre application / module, vous devez d'abord les installer, puis les ajouter à la dependenciessection de votre package.json.

--save-devajoute le package tiers aux dépendances de développement du package. Il ne sera pas installé lorsque quelqu'un installera votre package. Il n'est généralement installé que si quelqu'un clone votre référentiel source et l'exécute npm install.

--saveajoute le package tiers aux dépendances du package. Il sera installé avec le package chaque fois que quelqu'un s'exécute npm install package.

Les dépendances de développement sont les dépendances qui ne sont nécessaires que pour développer le package. Cela peut inclure des exécuteurs de test, des compilateurs, des conditionneurs, etc. Les deux types de dépendances sont stockés dans le package.jsonfichier du package . --saveajoute à dependencies, --save-devajoute àdevDependencies

La documentation d' installation de npm peut être consultée ici.

Lakshmi Swetha G
la source
37
Je le soupçonnais ... vous pouvez utiliser --save-dev et --save de manière interchangeable si vous construisez une application web qui ne deviendra pas un package, c'est-à-dire téléchargée à partir de npm, si vous développez un package à partager avec d'autres, il est important de comprendre la différence.
VFein
13
Merci enfin à quelqu'un qui dit son but lorsque vous utilisez npm install
CapturedTree
3
--save est maintenant par défaut avec l'installation de npm avec la sortie de npm 5 en 2017
NattyC
attendez, pourquoi des phrases complexes? Dans DevDependecy, le développeur peut installer les packages et il ne sera mis à jour que devDevependency. Ainsi, lorsque le nouveau développeur clone la base de code du projet et exécute npm install => ici uniquement dependency package name is going to install.dans node_modules .. pas le package du développeur comme dans Dev-dependency.
Anupam Maurya
60

Un parfait exemple de ceci est:

$ npm install typescript --save-dev

Dans ce cas, vous voudriez avoir Typescript (un langage de codage analysable par javascript) disponible pour le développement, mais une fois l'application déployée, elle n'est plus nécessaire, car tout le code a été transposé en javascript. En tant que tel, cela n'aurait aucun sens de l'inclure dans l'application publiée. En effet, cela ne prendrait que de l'espace et augmenterait les temps de téléchargement.

Jackalope
la source
4
Il en va de même pour: "$ npm install grunt --save-dev", car il est utile pour le développement, mais pas pour le déploiement.
Jackalope
1
Remarque: Microsoft suggère d'installer des packages @ types / xxx en tant que dépendances, et non devDependencies github.com/Microsoft/types-publisher/issues/81
Dave
2
Ce que je trouve confus, c'est comment est-ce important? Les packages enregistrés à l'aide ne --savesont toujours enregistrés que dans le node_modulesdossier. Le code n'est pas inclus dans le site Web déployé.
Kokodoko
6
@Kokodoko Lorsque vous utilisez l' --save-devindicateur, le package est ajouté à votre devDependenciesobjet. Si / quand quelqu'un installe votre package, tous dependenciessont téléchargés mais ne le devDependenciessont pas, car ils ne sont pas requis au moment de l'exécution. Comme l'indique la réponse, cela leur fait gagner du temps et de l'espace. Les développeurs travaillant sur vos fichiers de package eux-mêmes peuvent simplement s'exécuter npm installdans le répertoire du package pour installer devDependencieségalement le.
Jasjit Singh Marwah
Donc, si vous téléchargez un dépôt depuis github et tapez npm install, les devDependenciessont ignorés?
Kokodoko
41

Laisse moi te donner un exemple,

  • Vous êtes développeur d'une très GRAVE NPM bibliothèque . Qui utilise différentes bibliothèques de tests pour tester le package.
  • Un utilisateur a téléchargé votre bibliothèque et souhaite l'utiliser dans son code. Doivent-ils également télécharger vos bibliothèques de test? Peut-être que vous utilisez jestpour les tests et qu'ils utilisent mocha. Voulez-vous qu'ils soient également installés jest? Juste pour gérer votre bibliothèque?

Aucun droit? Voilà pourquoi ils sont là devDependencies.

Lorsque quelqu'un le fait, npm i yourPackageseules les bibliothèques requises pour exécuter votre bibliothèque seront installées. Les autres bibliothèques que vous avez utilisées pour regrouper votre code ou pour tester et simuler ne seront pas installées car vous les avez insérées devDependencies. Assez bien, non?

Alors, pourquoi les développeurs doivent-ils exposer les devDependancies ?

Supposons que votre package soit un package open source et que des centaines de personnes envoient des requêtes Pull à votre package. Alors, comment vont-ils tester le package? Ils feront git clonevotre repo et quand ils feraient npm iles dépendances ainsi que les dépendances dev .
Parce qu'ils n'utilisent pas votre package. Ils développent le package plus loin, ainsi, afin de tester votre package, ils doivent passer les cas de test existants et en écrire de nouveaux. Donc, ils doivent utiliser votre devDependenciesqui contient toutes les bibliothèques de test / construction / simulation que VOUS avez utilisées.

Aritra Chakraborty
la source
8
Beaucoup mieux que la réponse acceptée ainsi que la réponse avec le maximum de votes car cette réponse est de nature plus pratique. Merci!
Exception non capturée
Ce devrait être la réponse choisie. Toutes les autres réponses n'expliquent pas vraiment POURQUOI vous utiliseriez l'une sur l'autre.
Rocky Kev
34

Comme suggéré par @ andreas-hultgren dans cette réponse et selon les documents npm :

Si quelqu'un envisage 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.

Cependant, pour le développement d'applications Web, Yeoman (un outil d'échafaudage qui installe un fichier package.json pré-écrit entre autres) place tous les packages dans devDependencies et rien dans les dépendances, il semble donc que l'utilisation de --save-devest une valeur sûre dans le développement d'applications web , au moins.

wayfarer_boy
la source
3
Notez que j'ai rencontré des problèmes lors de l'utilisation de gulp et de l'installation de packages avec --save-devlesquels le package n'installerait pas ses dépendances requises. L'exécution a --saveinstallé ces dépendances manquantes.
Nick M
18
Je voudrais également noter que j'utilise maintenant --savepour tout sauf les dépendances de test et de documentation (selon la documentation npm). Je commence à penser que l'exemple Yeoman que j'ai mentionné ci-dessus n'est pas un bon exemple de meilleure pratique.
wayfarer_boy
Je pense que oui aussi, pourquoi auriez-vous besoin de cela --save-devdevient seulement moins clair avec chaque réponse ici :)
Kokodoko
20

--save-devenregistre la spécification semver dans le tableau "devDependencies" dans votre fichier descripteur de package, l' --saveenregistre à la place dans "dépendances".

alex
la source
83
et quelle est la différence fonctionnelle?
ahnbizcad
6
cette réponse est la plus logique pour moi, les dépendances dev sont alors nécessaires pour le développement mais pas pour la production, donc htmllint, la compilation sass, etc. et les dépendances sont pour les exigences de production, telles que Diaporama qui devra être présent pour que les choses fonctionnent.
Miller the gorilla
3
@ahnbizcad Il est mieux répondu ici, mais la principale différence fonctionnelle est que les devDependencies ne sont pas transitoirement incluses.
Rendez-vous le
N'est-ce pas la façon la plus intuitive de le décrire pour quelqu'un qui ne le sait pas déjà?: Dev --save-devrend les packages locaux à votre projet, alors --savequ'ils les rendent locaux à votre installation de node?
ahnbizcad
9

Des réponses claires sont déjà fournies. Mais il convient de mentionner comment devDependenciesaffecte l'installation des packages:

Par défaut, npm install installera tous les modules répertoriés comme dépendances dans package.json. Avec l'indicateur --production (ou lorsque la variable d'environnement NODE_ENV est définie sur production), npm n'installe pas les modules répertoriés dans devDependencies.

Voir: https://docs.npmjs.com/cli/install

Alireza
la source
8

Vous ne voulez généralement pas gonfler le package de production avec des choses que vous avez l'intention d'utiliser uniquement à des fins de développement.

Utilisez l' option --save-dev(ou -D) pour séparer les packages tels que les frameworks de test unitaire (jest, jasmine, mocha, chai, etc.)

Tous les autres packages dont votre application a besoin pour la production doivent être installés à l'aide de --save(ou -S).

npm install --save lodash       //prod dependency
npm install -S moment           // "       "
npm install -S opentracing      // "       "

npm install -D jest                 //dev only dependency
npm install --save-dev typescript   //dev only dependency

Si vous ouvrez le package.jsonfichier, vous verrez ces entrées répertoriées sous deux sections différentes:

"dependencies": {
  "lodash": "4.x",
  "moment": "2.x",
  "opentracing": "^0.14.1"
},

"devDependencies": {
    "jest": "22.x",
    "typescript": "^2.8.3"
},
velhala
la source
5

--save-dev est utilisé pour les modules utilisés dans le développement de l'application, pas requis lors de son exécution dans l'environnement de production --save est utilisé pour l'ajouter dans package.json et il est requis pour l'exécution de l'application.

Exemple: express, body-parser, lodash, casque, mysql tous ces éléments sont utilisés lors de l'exécution de l'application. -dépendances.

npm link ou npm install installera également les modules dev-dependency ainsi que les modules de dépendance dans votre dossier de projet

Biswadev
la source
3

Toutes les explications ici sont excellentes, mais il manque une chose très importante: comment installer uniquement les dépendances de production? (sans les dépendances de développement). Nous nous séparons dependenciesde devDependenciesen utilisant --saveou --save-dev. Pour installer tout ce que nous utilisons:

npm i

Pour installer uniquement des packages de production, nous devons utiliser:

npm i --only=production
Ronny Sherer
la source
0

Je veux ajouter mes idées comme

Je pense que tous les différents apparaîtront lorsque quelqu'un utilise vos codes au lieu de les utiliser vous-même

Par exemple, vous écrivez une bibliothèque HTTP appelée node's request

Dans votre bibliothèque,

vous avez utilisé lodash pour gérer la chaîne et l'objet, sans lodash, vos codes ne peuvent pas s'exécuter

Si quelqu'un utilise votre bibliothèque HTTP dans le cadre de ses codes. Vos codes seront compilés avec le sien.

vos codes ont besoin lodash, vous devez donc mettre dans dependenciesla compilation


Si vous écrivez un projet comme monaco-editor, qui est un éditeur Web,

vous avez regroupé tous vos codes et votre product env libraryutilisation du webpack, une fois la construction terminée, ne disposez que d'unmonaco-min.js

Donc , quelqu'un ne le font pas cas si --saveou --save-dependencies, seulement il avez besoin estmonaco-min.js

Sommaire:

  1. Si quelqu'un veut compiler vos codes (utiliser comme bibliothèque), mettez ceux lodashqui sont utilisés par vos codes dansdependencies

  2. Si quelqu'un veut ajouter plus de fonctionnalité à vos codes, il besoin unit testet compiler, les mettre endev-dependencies

caramel au beurre
la source
0

Les gens utilisent npm en production pour faire des trucs sympas, Node.js en est un exemple, donc vous ne voulez pas que tous vos outils de développement soient exécutés.

Si vous utilisez gulp (ou similaire) pour créer des fichiers de construction à placer sur votre serveur, cela n'a pas vraiment d'importance.

Tristanisginger
la source