web-dev-qa-db-fra.com

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

Quelle est la différence entre: 

npm install [nom_package] --save

et 

npm install [nom_package] --save-dev

Qu'est-ce que ça veut dire?

502
nfort
  • --save-dev est utilisé pour sauvegarder le paquet à des fins de développement ..__ Exemple: tests unitaires, minification .. 
  • --save est utilisé pour enregistrer le package requis pour l'exécution de l'application.
415
Tuong Le

La différence entre --save et --save-dev risque de ne pas être perceptible immédiatement si vous les avez essayés tous les deux sur vos propres projets. Alors, voici quelques exemples ...

Disons que vous construisiez une application utilisant le package moment pour analyser et afficher les dates. Votre application est un planificateur, elle a donc besoin de ce package, comme dans: ne peut pas s'exécuter sans elle. 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, il est vraiment utile d’utiliser des outils tels que des suites de tests et il peut être nécessaire d’utiliser jasmine-core et 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 faites pas besoin la suite de tests pour exécuter l'application dans son état normal; il s'agit donc d'une dépendance de type --save-dev, rien de plus. Vous pouvez voir comment, si vous ne comprenez pas ce qui se passe réellement, c’est un peu difficile à imaginer.

Tiré directement de NPM docs docs # dépendances

Dépendances

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

Veuillez ne pas placer de faisceaux de test ou de transpilers dans vos dépendances Object. Voir devDependencies, ci-dessous.

Même dans la documentation, il vous est demandé d’utiliser --save-dev pour des modules tels que les faisceaux de test. 

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

444
Michael Bruce

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 section dependencies de votre package.json.

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

--save ajoute le package tiers aux dépendances du package. Il sera installé avec le paquet chaque fois que quelqu'un exécutera npm install package.

Les dépendances de développement sont celles qui ne sont nécessaires que pour développer le paquet. Cela peut inclure des programmes de test, des compilateurs, des gestionnaires de package, etc. Les deux types de dépendances sont stockés dans le fichier package.json du package. --save ajoute à dependencies, --save-dev ajoute à devDependencies

npm install documentation peut être référé ici.

66
Lakshmi Swetha G

Un exemple parfait 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é transpilé 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 la place et augmenterait les temps de téléchargement.

39
Jackalope

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

Si une personne a l'intention de télécharger et d'utiliser votre module dans son programme, elle ne veut probablement pas ou n'a pas besoin de télécharger et de construire le test externe ou la structure de documentation que vous utilisez.

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

32
wayfarer_boy

--save-dev enregistre semver spec dans le tableau "devDependencies" de votre fichier de descripteur de package, --save l'enregistre ensuite dans "dépendances".

17
alex

Laisse moi te donner un exemple,

  • Vous êtes développeur d'un très SERIOUSnpmbibliothèque. Qui utilise différentes bibliothèques de test pour tester le paquet.
  • Un utilisateur a téléchargé votre bibliothèque et veut l'utiliser dans son code. Ont-ils également besoin de télécharger vos bibliothèques de tests? Vous utilisez peut-être jest pour les tests et ils utilisent mocha. Voulez-vous qu'ils installent également jest? Pour lancer votre lirary?

Aucun droit? C'est pourquoi ils sont dans devDependencies.

Lorsque quelqu'un le fait, npm i yourPackage uniquement les bibliothèques requises pour EXÉCUTER votre bibliothèque sera installée.

Donc, Pourquoi les développeurs doivent-ils exposer le devDependancies?

Supposons que votre paquet est un paquet open source et que des centaines de personnes envoient des demandes d'extraction à votre paquet. Alors comment vont-ils tester le paquet? Ils vont git clone votre dépôt et quand ils feront un npm i les dépendances ainsi que devDependencies. Parce qu'ils n'utilisent pas votre paquet. Ils développent le paquet plus loin, donc les devDependencies sont nécessaires.

5
Aritra Chakraborty

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

Exemple: express, analyseur de corps, lodash, casque, mysql sont tous utilisés lors de l'exécution de l'application, utilisez --save pour mettre en dépend -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 

4
BittuS

Des réponses claires sont déjà fournies. Mais il convient de mentionner comment devDependencies affecte 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'installera pas les modules répertoriés dans devDependencies.

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

4
Alireza

En règle générale, vous ne voulez pas gâcher le package de production avec des éléments que vous souhaitez uniquement utiliser à des fins de développement. Utilisez donc l’option --save-dev (ou -D) pour séparer les paquets tels que watchers (nodemon), les frameworks de tests unitaires (jest, jasmine, mocha, chai, etc.). 

Tous les autres packages de bibliothèque indispensables au fonctionnement de votre application 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 fichier package.json, ces entrées sont répertoriées dans deux sections différentes:

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

"devDependencies": {
    "jest": "22.x",
    "TypeScript": "^2.8.3"
},
2
velhala

Je veux ajouter quelques idées 

Je pense que toutes les différences apparaîtront lorsque quelqu'un utilisera 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 les chaînes et les objets, sans lodash, vos codes ne peuvent pas être exécutés

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 de lodash, il faut donc mettre dependencies pour compiler


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

vous avez regroupé tous vos codes et votre product env library à l'aide de webpack, une fois la construction terminée, ne possédez qu'un monaco-min.js

Donc, quelqu'un n'aime pas si --save ou --save-dependencies, il suffit qu'il soit monaco-min.js

Résumé:

  1. Si quelqu'un veut compiler vos codes (utiliser comme bibliothèque), mettez lodash utilisé par vos codes dans dependencies

  2. Si quelqu'un veut ajouter plus de fonctionnalités à vos codes, il a besoin de unit test et compiler, mettez-les dans dev-dependencies

0
toffee

npm install enregistre les packages spécifiés dans les dépendances par défaut. En outre, vous pouvez contrôler où et comment ils sont enregistrés avec des indicateurs supplémentaires:

-P, --save-prod: Le paquet apparaîtra dans vos dépendances. C'est la valeur par défaut sauf si -D ou -O sont présents.

-D, --save-dev: Le paquet apparaîtra dans votre devDependencies.

-O, --save-optional: Le package apparaîtra dans votre optionalDependencies.

--no-save: Empêche l'enregistrement dans dependencies.

Lorsque vous utilisez l'une des options ci-dessus pour enregistrer des dépendances dans votre package.json, il existe deux indicateurs supplémentaires facultatifs:

-E, --save-exact: Les dépendances enregistrées seront configurées avec une version exacte plutôt que d’utiliser l’opérateur par défaut de npm.

-B, --save-bundle: Les dépendances enregistrées seront également ajoutées à votre liste bundleDependencies.

0
hakiko

Node.js en est un exemple. Par conséquent, 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 à mettre sur votre serveur, cela n'a pas vraiment d'importance.

0
Tristanisginger