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.
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
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.
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.
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
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.
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.
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.
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".
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.
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:
--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
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:
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:
Si quelqu'un veut compiler vos codes (utiliser comme bibliothèque), mettez ceux lodashqui sont utilisés par vos codes dansdependencies
Si quelqu'un veut ajouter plus de fonctionnalité à vos codes, il besoin unit testet compiler, les mettre endev-dependencies
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.
npm install --production
. C'est la différence opérationnelle (voir https://docs.npmjs.com/cli/install pour plus d'informations).NODE_ENV
sur production,npm install
exclut automatiquement les packages de développement.Réponses:
--save-dev
est 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.la source
-D
raccourcies : est l'abréviation de--save-dev
et-S
est l'abréviation de--save
--save
option n'est plus nécessaire. Si vous le faitesnpm install my-package
, il ajoutera "mon-package" comme dépendance dans le fichier package.json.La différence entre
--save
et--save-dev
peut 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
Cela créerait une nouvelle valeur dans votre package.json
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
Cela créerait également une nouvelle valeur dans votre package.json
Vous n'avez pas besoin de la suite de tests pour exécuter l'application dans son état normal, c'est donc une
--save-dev
dé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
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.
la source
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
dependencies
section de votrepackage.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 package. Il n'est généralement installé que si quelqu'un clone votre référentiel source et l'exécutenpm install
.--save
ajoute le package tiers aux dépendances du package. Il sera installé avec le package chaque fois que quelqu'un s'exécutenpm 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.json
fichier du package .--save
ajoute àdependencies
,--save-dev
ajoute àdevDependencies
La documentation d' installation de npm peut être consultée ici.
la source
dependency package name is going to install.
dans node_modules .. pas le package du développeur comme dans Dev-dependency.Un parfait exemple de ceci est:
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.
la source
--save
sont toujours enregistrés que dans lenode_modules
dossier. Le code n'est pas inclus dans le site Web déployé.--save-dev
indicateur, le package est ajouté à votredevDependencies
objet. Si / quand quelqu'un installe votre package, tousdependencies
sont téléchargés mais ne ledevDependencies
sont 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écuternpm install
dans le répertoire du package pour installerdevDependencies
également le.npm install
, lesdevDependencies
sont ignorés?Laisse moi te donner un exemple,
jest
pour les tests et qu'ils utilisentmocha
. Voulez-vous qu'ils soient également installésjest
? Juste pour gérer votre bibliothèque?Aucun droit? Voilà pourquoi ils sont là
devDependencies
.Lorsque quelqu'un le fait,
npm i yourPackage
seules 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éesdevDependencies
. 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 clone
votre repo et quand ils feraientnpm i
les 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
devDependencies
qui contient toutes les bibliothèques de test / construction / simulation que VOUS avez utilisées.la source
Comme suggéré par @ andreas-hultgren dans cette réponse et selon les documents npm :
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-dev
est une valeur sûre dans le développement d'applications web , au moins.la source
--save-dev
lesquels le package n'installerait pas ses dépendances requises. L'exécution a--save
installé ces dépendances manquantes.--save
pour 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.--save-dev
devient seulement moins clair avec chaque réponse ici :)--save-dev
enregistre la spécification semver dans le tableau "devDependencies" dans votre fichier descripteur de package, l'--save
enregistre à la place dans "dépendances".la source
--save-dev
rend les packages locaux à votre projet, alors--save
qu'ils les rendent locaux à votre installation de node?Des réponses claires sont déjà fournies. Mais il convient de mentionner comment
devDependencies
affecte l'installation des packages:Voir: https://docs.npmjs.com/cli/install
la source
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
).Si vous ouvrez le
package.json
fichier, vous verrez ces entrées répertoriées sous deux sections différentes:la source
--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
la source
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
dependencies
dedevDependencies
en utilisant--save
ou--save-dev
. Pour installer tout ce que nous utilisons:Pour installer uniquement des packages de production, nous devons utiliser:
la source
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
dependencies
la compilationSi vous écrivez un projet comme
monaco-editor
, qui est un éditeur Web,vous avez regroupé tous vos codes et votre
product env library
utilisation du webpack, une fois la construction terminée, ne disposez que d'unmonaco-min.js
Donc , quelqu'un ne le font pas cas si
--save
ou--save-dependencies
, seulement il avez besoin estmonaco-min.js
Sommaire:
Si quelqu'un veut compiler vos codes (utiliser comme bibliothèque), mettez ceux
lodash
qui sont utilisés par vos codes dansdependencies
Si quelqu'un veut ajouter plus de fonctionnalité à vos codes, il besoin
unit test
etcompiler
, les mettre endev-dependencies
la source
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.
la source