Šī dokumentācija ļoti vāji atbild uz manu jautājumu. Es nesapratu šos paskaidrojumus. Vai kāds var pateikt vienkāršāk? Varbūt ar piemēriem, ja ir grūti izvēlēties vienkāršus vārdus?
EDIT Pievienots arī peerDependencies
, kas ir cieši saistīts un var radīt neskaidrības.
Svarīgu uzvedības atšķirību kopsavilkums:
atkarības
ir instalētas abās sistēmās:npm install
no direktorijas, kas satur package.json
npm install $package
jebkurā citā direktorijādevDependencies
ir:npm install
tiek instalēts direktorijā, kas satur package.json
, ja vien nav norādīts --production
karodziņš (upvote Gayan Charith's answer).npm install "$package"
jebkurā citā direktorijā, ja vien nenorādāt --dev
opciju.peerDependencies
:npm install
, un jums atkarība jāatrisina pašiem manuāli. Palaišanas laikā, ja atkarības nav, tiek parādīta kļūda (minēja @nextgentech).devDependencies
netiek instalēta tranzitīvi. Piemēram, mums nav nepieciešams pārbaudīt B, lai pārbaudītu A, tāpēc B testēšanas atkarības var izlaist.
Saistītās iespējas, kas šeit nav aplūkotas:bundledDependencies
, kas ir aplūkota nākamajā jautājumā: https://stackoverflow.com/questions/11207638/advantages-of-bundleddependencies-over-normal-dependencies-in-npm?lq=1optionalDependencies
(minējis Aidan Feldman).devDependencies
ir nepieciešamas, lai palaistu, devDependencies
tikai, lai izstrādātu, piemēram: vienības testus, CoffeeScript transpilāciju uz JavaScript, minifikāciju, ...
Ja gatavojaties izstrādāt pakotni, lejupielādējiet to (piemēram, izmantojot git clone
), dodieties uz tās sakni, kurā ir package.json
, un palaidiet:
npm install
Tā kā jums ir faktiskais pirmavots, ir skaidrs, ka vēlaties to izstrādāt, tāpēc pēc noklusējuma tiek instalētas gan atkarības
(jo, lai izstrādātu, jums, protams, ir jāpalaiž), gan devDependency
atkarības.
Tomēr, ja esat tikai galalietotājs, kas vienkārši vēlas instalēt pakotni, lai to izmantotu, jūs to izdarīsiet no jebkura kataloga:
npm install "$package"
Šādā gadījumā parasti jums nav nepieciešamas izstrādes atkarības, tāpēc jūs saņemat tikai to, kas nepieciešams pakotnes lietošanai: dependencies
.
Ja šajā gadījumā patiešām vēlaties instalēt izstrādes pakotnes, varat iestatīt konfigurācijas opciju dev
uz true
, iespējams, no komandrindas kā:
npm install "$package" --dev
Pēc noklusējuma šī opcija ir false
, jo šis ir daudz retāk sastopams gadījums.
(Testēts pirms 3.0)
Avots: https://nodejs.org/en/blog/npm/peer-dependencies/
Izmantojot parastās atkarības, jums var būt vairākas atkarības versijas: tās vienkārši tiek instalētas atkarības node_modules
iekšpusē.
Piemēram, ja atkarība1
un atkarība2
abas ir atkarīgas no atkarības3
dažādās versijās, projekta koks izskatīsies šādi:
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
Tomēr spraudņi ir paketes, kurām parasti nav nepieciešama cita pakete, ko šajā kontekstā sauc par hostētāju. Tā vietā:
atkarība1
un atkarība2
ir savstarpēji atkarīgas no atkarības3
, projekta koks izskatīsies šādi:root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
Tas notiek pat tad, ja package.json
failā package.json
nav minēta atkarība3
.
Es domāju, ka tas ir Inversion of Control projektēšanas parauga piemērs.
Līdzinieku atkarību prototipisks piemērs ir Grunt, resursdators un tā spraudņi.
Piemēram, Grunt spraudnim, piemēram, https://github.com/gruntjs/grunt-contrib-uglify, jūs redzēsiet, ka:
ir
peer-dependency`.require('grunt')
atrodas zem tests/
: programma to faktiski neizmanto.
Tad, kad lietotājs izmantos spraudni, viņš netieši pieprasīs spraudni no Grunt faila
, pievienojot grunt.loadNpmTasks('grunt-contrib-uglify')
rindu, bet lietotājs tieši izsauks grunt
.
Tas nedarbotos, ja katram spraudnim būtu nepieciešama atšķirīga Grunt versija.Domāju, ka dokumentācija diezgan labi atbild uz jautājumu, varbūt jūs vienkārši neesat pietiekami labi iepazinies ar mezglu / citiem pakešu pārvaldītājiem. Iespējams, es to saprotu tikai tāpēc, ka nedaudz pārzinu Ruby bundler. Galvenā rindiņa ir šāda:
Šīs lietas tiks instalētas, veicot npm link vai npm install no paketes saknes, un tās var pārvaldīt tāpat kā jebkuru citu npm konfigurācijas parametru. Vairāk par šo tēmu skatiet npm-config(7). Un tad sadaļā npm-config(7) atrodiet
dev
:
Default: false
Type: Boolean
Install dev-dependencies along with packages.
Ir daži moduļi un paketes, kas nepieciešamas tikai izstrādes vajadzībām, bet nav nepieciešamas ražošanā. Kā teikts dokumentācijā:
Ja kāds plāno lejupielādēt un izmantot jūsu moduli savā programmā, tad, visticamāk, viņš nevēlas vai viņam nav nepieciešams lejupielādēt un veidot ārējo testēšanas vai dokumentācijas ietvaru, ko jūs izmantojat. Šādā gadījumā vislabāk ir uzskaitīt šos papildu elementus devDependencies hash.