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?
--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.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.
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.
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.
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.
--save-dev
enregistre semver spec dans le tableau "devDependencies" de votre fichier de descripteur de package, --save
l'enregistre ensuite dans "dépendances".
Laisse moi te donner un exemple,
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.
--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
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.
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"
},
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é:
Si quelqu'un veut compiler vos codes (utiliser comme bibliothèque), mettez lodash
utilisé par vos codes dans dependencies
Si quelqu'un veut ajouter plus de fonctionnalités à vos codes, il a besoin de unit test
et compiler
, mettez-les dans dev-dependencies
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.
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.