Această documentație răspunsurile la întrebarea mea foarte slab. Am't înțelegi aceste explicații. Poate cineva să spună în cuvinte simple? Poate cu exemple daca's greu de a alege cuvinte simple?
EDIT adăugat, de asemenea, peerDependencies
, care este strâns legată și ar putea duce la confuzie.
Rezumat de important comportamentul diferențe:
dependențele
sunt instalate pe ambele: npm instala
de un director care conține pachetul.json` devDependencies
sunt: , dacă nu trece
--producție` pavilion (du-te upvote Gayan Charith's a răspunde). --dev
opțiune. peerDependencies
: devDependencies
nu este instalat transitively. E. g. am don't nevoie pentru a testa B pentru a testa O, atât de B's dependențe de testare poate fi lăsat pe dinafară.
Opțiunile legate de discutat aici: bundledDependencies
care este discutat la următoarea întrebare: https://stackoverflow.com/questions/11207638/advantages-of-bundleddependencies-over-normal-dependencies-in-npm?lq=1 optionalDependencies
(menționată by Aidan Feldman) dependențele
sunt necesare pentru a rula, devDependencies
doar pentru a dezvolta, de exemplu: teste unitare, CoffeeScript să JavaScript transpilation, minimizare, ...
Dacă aveți de gând să dezvolte un pachet, descărcați-l (de exemplu, prin git clona
), du-te la rădăcină care conține pachetul.json`, și a alerga:
npm install
Din moment ce au sursa reală, este clar că vrei să-l dezvolte, astfel încât în mod implicit, atât dependențele
(când trebuie, desigur, a alerga să se dezvolte) și devDependency
dependențele sunt, de asemenea, instalat.
Dacă, însă, sunt doar un utilizator final care vrea doar să instalați un pachet să-l folosească, vă va face din orice director:
npm install "$package"
În acest caz, în mod normal, nu't vrei dezvoltarea dependențe, așa că veți obține ceea ce este necesar pentru a utiliza pachetul: dependențele
.
Dacă doriți cu adevărat pentru a instala pachete de dezvoltare în acest caz, puteți seta dev
opțiune de configurare pentru "adevărat", eventual de la linia de comandă ca:
npm install "$package" --dev
Opțiunea este "fals" în mod implicit, deoarece aceasta este o mult mai puțin comune caz.
(Testat înainte de 3.0)
Sursa: https://nodejs.org/en/blog/npm/peer-dependencies/
Cu regulat dependențe, puteți avea mai multe versiuni de dependență: it's pur și simplu instalat în interiorul node_modules
de dependență.
E. g. dacă dependency1 " și " dependency2depind
dependency3 la diferite versiuni de proiect copac va arata asa:
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
Plugin-uri, cu toate acestea, sunt pachete care în mod normal nu't nevoie de alt pachet, care este numit gazdă în acest context. În loc:
peer depind de
dependency3, proiectul copac va arata asa: root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
Acest lucru se întâmplă chiar dacă n-ai spus niciodată `dependency3 " în " pachetul.json file. Cred că acest lucru este un exemplu de Inversiune de Control model de design. Un elocvent exemplu de la egal la egal dependențe este Grunt, gazdă, și plugin-uri sale. De exemplu, pe un Mormăit plugin ca https://github.com/gruntjs/grunt-contrib-uglify, veți vedea că:
grunt "este o" peer-dependență
e sub
teste/: l's, de fapt, nu folosite de program. Apoi, atunci când utilizatorul va folosi un plugin, el va implicit, necesită plugin-ul de la
Gruntfileprin adăugarea un mormăit.loadNpmTasks('grunt-contrib-urâți')
linie, dar's `mormăit că utilizatorul va apela direct.
Acest lucru nu ar funcționa atunci dacă fiecare plugin necesar un alt Mormăit versiune. Cred că documentația răspunde la întrebarea destul de bine, poate că nu sunt doar suficient de familiarizat cu nod / alte managere de pachete. Probabil că am înțelege doar pentru că știu un pic despre Ruby bundler. Cheia linie este:
Aceste lucruri va fi instalat atunci când faci npm link sau npm instala din rădăcină de un pachet și pot fi gestionate ca orice alte npm parametru de configurare. Vezi npm-config(7) pentru mai multe pe acest subiect. Și apoi, sub npm-config(7) găsiți
dev
:
Default: false
Type: Boolean
Install dev-dependencies along with packages.
Dacă nu doriți să instalați devDependencies puteți folosi npm install-producție`
Pentru a salva un pachet pachet.json ca dev dependențe:
npm install "$package" --save-dev
Atunci când tu a alerga npm instala
se va instala atât devDependencies " și " dependențe
. Pentru a evita instala devDependencies
run:
npm install --production
dependențe Dependențele că proiectul dumneavoastră are nevoie pentru a rula, cum ar fi o bibliotecă care oferă funcții care suni din cod. Acestea sunt instalate transitively (dacă a depinde de B depinde de C, npm instala pe Un va instala B și C). Exemplu: lodash: proiect solicită o parte lodash funcții.
devDependencies Dependențele ai nevoie doar de timpul de dezvoltare sau de eliberare, ca compilatoare care codul dvs. și compilează în javascript, test de cadre sau documentația generatoare. Acestea nu sunt instalate transitively (dacă a depinde de B dev-depinde de C, npm instala pe Un va instala B numai). Exemplu: grunt: proiectul utilizează grunt pentru a construi în sine.
peerDependencies Dependențe ce proiectul dumneavoastră se conectează în, sau care modifică, în proiectul de părinte, de obicei, un plugin pentru alte bibliotecă sau instrument. Acesta este destinat să fie un cec, asigurându-vă că proiectul de părinte (proiect care va depinde de proiect) are o dependență pe proiect se prinde în cârlig. Deci, dacă ai face un plugin care adaugă funcționalitate la biblioteca B, apoi cineva face un proiect va trebui să aibă o dependență pe B dacă au o dependență pe C. Acestea nu sunt instalate (dacă npm < 3), acestea sunt doar verificat. Exemplu: grunt: proiect adaugă funcționalitate pentru a mormăit și pot fi utilizate numai pe proiecte care folosesc mormăit.
Acest document explică peer dependențe foarte bine: https://nodejs.org/en/blog/npm/peer-dependencies/
De asemenea, npm documentația a fost îmbunătățit de-a lungul timpului, iar acum are mai multe explicații ale diferitelor tipuri de dependențe: https://github.com/npm/cli/blob/latest/doc/files/package.json.md#devdependencies
Există unele module și pachete necesar doar pentru dezvoltare, care nu sunt necesare în producție. Așa cum se spune în documentația:
Dacă cineva este de planificare pe descărcarea și utilizarea modulului în programul lor, atunci, probabil, nu't doresc sau au nevoie pentru a descărca și de a construi externe de testare sau documentația-cadru pe care îl utilizați. În acest caz, se's cel mai bun pentru a lista aceste elemente suplimentare într-un devDependencies hash.
O explicație simplă pe care a făcut-o mai clar pentru mine este:
Când implementați aplicația, module în dependențe trebuie să fie instalat sau aplicația dvs. câștigat't de lucru. Module în devDependencies don't trebuie să fie instalat pe serverul de producție de când te - 're nu se dezvoltă pe această mașină. link
Am'd dori să adaug la raspunsul meu de vedere pe aceste dependențe explicații
devDependencies
sunt utilizate pentru procesul de construire, instrumente care vă ajută să gestionați modul în care sfârșitul cod va sfârși, al treilea partid test module (ex. webpack chestii)peerDependencies
n't prea are sens pentru mine, până când am citit acest fragment din un post pe blog pe acest subiect Ciro menționate mai sus:
Ce [plugin-uri] aveti nevoie este un mod de a exprima aceste "dependențe" între plug și gazda lor pachetului. Un fel de a spune, "eu lucrez numai atunci când conectat la versiunea 1.2.x al meu pachet de gazdă, așa că, dacă instalați mine, asigurați-vă că este alături de o gazdă compatibile." Noi numim această relație colegială dependență.
peerDependencies
sunt pentru plugin-uri, biblioteci care necesită un "gazdui" biblioteca pentru a efectua funcția lor, dar poate au fost scrise la un moment dat înainte cea mai recentă versiune de gazdă a fost lansat.
Asta este, dacă am scrie PluginX v1 "pentru" HostLibraryX v3 și de mers pe jos,'s nici o garanție
PluginX v1va funcționa atunci când
HostLibraryX v4(sau chiar
HostLibraryX v3.0.1`) este eliberat.
Din punct de vedere al plugin-ul, doar adaugă funcții de la host library. Eu nu't chiar "trebuie" gazdă pentru a adăuga o dependență la un plugin, și plugin-uri de multe ori nu't literalmente depind de pe gazda lor. Dacă tu nu't fi gazdă, plugin-ul inofensiv nu face nimic.
Acest lucru înseamnă dependențele
e't într-adevăr dreptul de concept pentru plugin-uri.
Chiar mai rău, dacă gazda mea a fost tratat ca o dependență, am'd ajunge în această situație același post pe blog menționează (editat un pic pentru a utiliza acest răspuns's-a host & plugin):
Dar acum, [dacă tratăm versiune contemporană a HostLibraryX ca o dependență pentru PluginX,] funcționare
npm instala
rezultate în neașteptate dependență de graficul deă── [email protected] └─┬ [email protected] └── [email protected]
voi lăsa subtile eșecuri care vin de la plugin-ul folosind un alt [HostLibraryX] API decât principale de aplicare pentru imaginația ta.
... ca's ideea de plugin-uri. Acum, în cazul în care gazda a fost destul de frumos pentru a include informații dependență pentru toate * plugin-uri sale, care'd rezolva problema, dar ca'd introduce, de asemenea, o mare nouă problemă culturală*: plugin-ul de management!
Ideea de plugin-uri este faptul că acestea pot asocia în mod anonim. Într-o lume perfectă, având gazdă administra 'le-ar fi elegant & ordonat, dar am're nu va necesita biblioteci turma de pisici.
În schimb, avem conceptul de a fi colegi. Nici gazda, nici plugin-ul se află în alte's dependență găleată. Amândoi locuiesc la același nivel de dependență grafic.
Dacă am'm PluginX v1
și astept un peer (care este, au o peerDependency de) HostLibraryX v3
, I'll să spun așa. Daca've auto-actualizat la cele mai recente HostLibraryX v4(rețineți că's version ***4***) *ȘI* au
Plugin v1` instalat, trebuie să știți, nu?
npm
poate't de a gestiona această situație pentru mine ...
"Hei, văd că're folosind
PluginX v1
! Am'm automat declasareaHostLibraryX
de la v4 la v3, kk?"
... sau...
"Hei, eu te're folosind
PluginX v1
. Că se așteaptă caHostLibraryX v3
, care'am lăsat în praf în ultima actualizare. Pentru a fi în siguranță, am'm automat dezinstalareaPlugin v1
!!1!
Ce zici nu, npm?!
Deci npm nu't. Acesta vă avertizează cu privire la situația, și vă permite să vă dați seama dacă HostLibraryX v4 este potrivit peer pentru Plugin v1
.
Bun `peerDependency de management în plugin-uri va face acest concept lucra mai mult intuitiv în practică. De blog, dar din nou...
Un sfat: peer dependență de cerințele, spre deosebire de cele regulate dependențe, ar trebui să fie indulgent. Tu nu ar trebui să-ți încui peer dependențe jos la anumite versiuni de patch-uri. Ar fi foarte enervant, dacă unul Chai plugin peer-depindea de Chai 1.4.1, în timp ce un alt depindea de Chai 1.5.0, pur și simplu pentru că autorii au fost leneș și nu-mi petrec timpul gândindu-ne efectiv minim versiunea de Chai sunt compatibile cu.
Pe scurt
Dependențe - npm instala <pachetul> - salvați-prod
se instalează pachete cerute de cererea în mediul de producție.
DevDependencies - npm instala <pachetul> - salvați-dev
instalează
pachetele necesare numai pentru dezvoltarea locală și testarea
Doar tastând npm instala
instaleaza toate pachetele menționate în
pachet.json
deci, dacă sunteți de lucru pe computer local doar de tip npm instala
și continua :)
Dependențe vs dev dependențe
Dev dependențele sunt module care sunt necesare doar în timpul dezvoltării, întrucât dependențele sunt necesare la execuție. Dacă implementați aplicația dumneavoastră, dependențe trebuie să fie instalat, sau altceva aplicația pur și simplu nu va funcționa. Bibliotecile care suni din cod, care permite programului să ruleze pot fi considerate ca dependințe.
De exemplu - de a Reacționa , de a Reacționa - dom
Dev dependență module nu trebuie să fie instalat în serverul de producție din moment ce nu sunt de gând să dezvolte în acea mașină .compilatoare, care sub acoperire cod javascript , test de cadre și documentul de generatoare pot fi considerate ca dev-dependențe, deoarece acestea sunt necesare doar în timpul de dezvoltare .
De exemplu - ESLint , Babel , webpack
@FYI,
mod-a
dev-dependents:
- mod-b
dependents:
- mod-c
mod-d
dev-dependents:
- mod-e
dependents:
- mod-a
----
npm install mod-d
installed modules:
- mod-d
- mod-a
- mod-c
----
checkout the mod-d code repository
npm install
installed modules:
- mod-a
- mod-c
- mod-e
Dacă publicați la npm, atunci este important să utilizați corect steagul corect module. Dacă e ceva care-ți modul de nmp are nevoie pentru a funcționa, apoi utilizați " - salvați" pavilion pentru a salva modul ca o dependență. Dacă este ceva care modulul nu't nevoie pentru a funcționa, dar este necesar pentru testare, apoi utilizați " - salvați-dev" pavilion.
# For dependent modules
npm install dependent-module --save
# For dev-dependent modules
npm install development-module --save-dev