Denne dokumentasjonen svarer veldig dårlig på spørsmålet mitt. Jeg forsto ikke disse forklaringene. Kan noen si det med enklere ord? Kanskje med eksempler hvis det er vanskelig å velge enkle ord?
EDIT la også til peerDependencies
, som er nært beslektet og kan skape forvirring.
Oppsummering av viktige atferdsforskjeller:
avhengigheter
er installert på begge:npm install
fra en katalog som inneholder package.json
, ognpm install $package
på en hvilken som helst annen katalogdevDependencies
er:npm install
på en katalog som inneholder package.json
, med mindre du sender --production
-flagget (gå upvote Gayan Chariths svar).npm install "$package"
på noen annen katalog, med mindre du gir den --dev
-alternativet.peerDependencies
:npm install
, og du må selv løse avhengigheten manuelt. Når du kjører, hvis avhengigheten mangler, får du en feil (nevnt av @nextgentech)avhengigheter
installeres transitivt: hvis A krever B, og B krever C, så blir C installert, ellers kunne ikke B fungere, og heller ikke A.devDependencies
installeres ikke transitivt. F.eks. trenger vi ikke å teste B for å teste A, så B's testavhengigheter kan utelates.
Beslektede alternativer diskuteres ikke her:bundledDependencies
som diskuteres på følgende spørsmål: https://stackoverflow.com/questions/11207638/advantages-of-bundleddependencies-over-normal-dependencies-in-npm?lq=1optionalDependencies
(nevnt av Aidan Feldman)avhengigheter
kreves for å kjøre, devDependencies
bare for å utvikle, f.eks: enhetstester, CoffeeScript til JavaScript-transpilering, minifisering, ...
Hvis du skal utvikle en pakke, laster du den ned (f.eks. via git clone
), går til roten som inneholder package.json
, og kjører:
npm install
Siden du har den faktiske kilden, er det klart at du vil utvikle den, så som standard er både dependencies
(siden du selvfølgelig må kjøre for å utvikle) og devDependency
avhengigheter også installert.
Hvis du imidlertid bare er en sluttbruker som bare vil installere en pakke for å bruke den, vil du gjøre det fra hvilken som helst katalog:
npm install "$package"
I så fall vil du normalt ikke ha utviklingsavhengighetene, så du får bare det som trengs for å bruke pakken: avhengigheter
.
Hvis du virkelig ønsker å installere utviklingspakker i det tilfellet, kan du sette konfigurasjonsalternativet dev
til true
, muligens fra kommandolinjen som:
npm install "$package" --dev
Alternativet er false
som standard siden dette er et mye mindre vanlig tilfelle.
(Testet før 3.0)
Kilde: https://nodejs.org/en/blog/npm/peer-dependencies/
Med vanlige avhengigheter kan du ha flere versjoner av avhengigheten: den installeres ganske enkelt inne i node_modules
av avhengigheten.
F.eks. hvis avhengighet1
og avhengighet2
begge er avhengige av avhengighet3
i forskjellige versjoner, vil prosjekttreet se slik ut:
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
Plugins er imidlertid pakker som normalt ikke krever den andre pakken, som kalles host i denne sammenhengen. I stedet
dependency1
og dependency2
er avhengig av dependency3
, vil prosjekttreet se slik ut:root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
Dette skjer selv om du aldri nevner dependency3
i filen package.json
.
Jeg tror dette er et eksempel på designmønsteret Inversion of Control.
Et prototypisk eksempel på gjensidig avhengighet er Grunt, verten, og dens plugins.
For eksempel, på en Grunt-plugin som https://github.com/gruntjs/grunt-contrib-uglify, vil du se at:
grunt
er en peer-avhengighet
.require('grunt')
er under tests/
: den brukes faktisk ikke av programmet.
Deretter, når brukeren vil bruke en plugin, vil han implisitt kreve plugin fra Gruntfile
ved å legge til en grunt.loadNpmTasks('grunt-contrib-uglify')
linje, men det er grunt
som brukeren vil kalle direkte.
Dette ville ikke fungere da hvis hver plugin krevde en annen Grunt-versjon.Jeg tror dokumentasjonen svarer på spørsmålet ganske bra, kanskje du ikke bare er kjent nok med node / andre pakkeadministratorer. Jeg forstår det sannsynligvis bare fordi jeg vet litt om Ruby bundler. Nøkkellinjen er:
Disse tingene vil bli installert når du gjør npm-kobling eller npm-installasjon fra roten til en pakke og kan administreres som alle andre npm-konfigurasjonsparametere. Se npm-config(7) for mer om emnet. Og under npm-config(7) finner du
dev
:
Default: false
Type: Boolean
Install dev-dependencies along with packages.
Det er noen moduler og pakker som bare er nødvendige for utvikling, som ikke er nødvendige i produksjon. Som det står i dokumentasjonen:
Hvis noen planlegger å laste ned og bruke modulen din i programmet sitt, vil de sannsynligvis ikke eller trenger å laste ned og bygge det eksterne test- eller dokumentasjonsrammeverket du bruker. I dette tilfellet er det best å liste opp disse ekstra elementene i en devDependencies-hash.