Vraag Wat is het verschil tussen afhankelijkheden, devDependencies en peerDependencies in het pakket npm package.json?


Deze documentatie beantwoordt mijn vraag zeer slecht. Ik begreep die uitleg niet. Kan iemand in eenvoudiger woorden zeggen? Misschien met voorbeelden als het moeilijk is om eenvoudige woorden te kiezen?


1460
2017-09-18 14:57


oorsprong


antwoorden:


Samenvatting van belangrijke gedragsverschillen:

  • dependencies zijn geïnstalleerd op beide:

    • npm install uit een map die bevat package.json
    • npm install $package in een andere map
  • devDependencies zijn:

    • ook geïnstalleerd op npm install in een map die bevat package.json, tenzij je de --production vlag (ga naar boven Het antwoord van Gayan Charith).
    • niet geïnstalleerd op npm install "$package" in een andere map, tenzij je het de --dev keuze.
    • zijn niet transitief geïnstalleerd.
  • peerDependencies:

    • vóór 3.0: worden altijd geïnstalleerd als ze ontbreken en verhogen een fout als meerdere incompatibele versies van de afhankelijkheid door verschillende afhankelijkheden zouden worden gebruikt.
    • verwacht vanaf 3.0 (niet getest): geef een waarschuwing als deze ontbreekt npm install, en je moet de afhankelijkheid zelf handmatig oplossen. Als de afhankelijkheid ontbreekt, krijg je een foutmelding (vermeld door @nextgentech)
  • Transitiviteit (vermeld door Ben Hutchison):

    • dependencies zijn transitief geïnstalleerd: als A B vereist en B C vereist, dan wordt C geïnstalleerd, anders zou B niet kunnen werken, en dat geldt ook voor A.

    • devDependencies zijn niet transitief geïnstalleerd. Bijv. we hoeven B niet te testen om A te testen, dus de testafhankelijkheden van B kunnen worden weggelaten.

Gerelateerde opties die hier niet worden besproken:

devDependencies

dependencies zijn nodig om te rennen, devDependencies alleen om te ontwikkelen, bijvoorbeeld: unit tests, Coffeescript naar Javascript transpilation, minification, ...

Als je een pakket gaat ontwikkelen, download je het (bijvoorbeeld via git clone), ga naar de root die bevat package.json, en loop:

npm install

Aangezien u de werkelijke bron hebt, is het duidelijk dat u deze wilt ontwikkelen, dus beide dependencies (aangezien je natuurlijk moet rennen om te ontwikkelen) en devDependency afhankelijkheden zijn ook geïnstalleerd.

Als u echter slechts een eindgebruiker bent die alleen een pakket wil installeren om het te gebruiken, dan doet u dat vanuit elke directory:

npm install "$package"

In dat geval wilt u normaal gesproken geen ontwikkelingsafhankelijkheden, dus u krijgt precies wat nodig is om het pakket te gebruiken: dependencies.

Als u in dat geval echt ontwikkelpakketten wilt installeren, kunt u de dev configuratieoptie naar true, mogelijk vanaf de opdrachtregel als:

npm install "$package" --dev

De optie is false standaard omdat dit een veel minder vaak voorkomend geval is.

peerDependencies

(getest vóór 3.0)

Bron: https://nodejs.org/en/blog/npm/peer-dependencies/

Met reguliere afhankelijkheden kun je meerdere versies van de afhankelijkheid hebben: het is eenvoudig geïnstalleerd in de node_modulesvan de afhankelijkheid.

Bijv. als dependency1 en dependency2 beide zijn afhankelijk van dependency3 bij verschillende versies ziet de projectboom er als volgt uit:

root/node_modules/
                 |
                 +- dependency1/node_modules/
                 |                          |
                 |                          +- dependency3 v1.0/
                 |
                 |
                 +- dependency2/node_modules/
                                            |
                                            +- dependency3 v2.0/

Plug-ins zijn echter pakketten die normaal niet het andere pakket vereisen, dat de gastheer in deze context. In plaats daarvan:

  • plug-ins zijn verplicht door de gastheer
  • plug-ins bieden een standaardinterface die de host verwacht te vinden
  • alleen de host wordt rechtstreeks door de gebruiker gebeld, dus er moet een enkele versie van zijn.

Bijv. als dependency1 en dependency2 peer afhankelijk van dependency3, de projectboom ziet er als volgt uit:

root/node_modules/
                 |
                 +- dependency1/
                 |
                 +- dependency2/
                 |
                 +- dependency3 v1.0/

Dit gebeurt ook al vermeld je het nooit dependency3 in uw package.json het dossier.

Ik denk dat dit een voorbeeld is van de Inversie van controle ontwerp patroon.

Een voorbeeld van peer-afhankelijkheden is Grunt, de host en de plug-ins.

Bijvoorbeeld op een Grunt-plugin zoals https://github.com/gruntjs/grunt-contrib-uglify, je zult zien dat:

  • grunt is een peerDependency
  • de enige require('grunt') is onder tests/: het wordt niet gebruikt door het programma.

Wanneer de gebruiker vervolgens een plug-in gebruikt, zal hij impliciet de plug-in van de Gruntfile door een toe te voegen grunt.loadNpmTasks('grunt-contrib-uglify') regel, maar het is grunt dat de gebruiker direct zal bellen.

Dit zou niet werken als elke plug-in een andere Grunt-versie nodig had.

Met de hand

Ik denk dat het document de vraag heel goed beantwoordt, misschien ben je niet zo bekend genoeg met node / andere pakketbeheerders. Ik begrijp het waarschijnlijk alleen omdat ik een beetje weet over Ruby-bundler.

De belangrijkste regel is:

Deze dingen worden geïnstalleerd wanneer npm link of npm install wordt uitgevoerd vanuit de root van een pakket en kunnen worden beheerd zoals elke andere paramper van de npm-configuratie. Zie npm-config (7) voor meer informatie over het onderwerp.

En dan onder npm-config (7) vinden dev:

Default: false
Type: Boolean

Install dev-dependencies along with packages.

1739
2018-02-25 04:25



Als u geen devDependencies wilt installeren, kunt u het gewoon gebruiken npm install --production 


361
2017-07-05 10:06



Mocha zou bijvoorbeeld normaal gesproken een devDependency zijn, omdat testen niet nodig is in de productie, terwijl express een afhankelijkheid zou zijn.


91
2017-09-18 18:39



Om een ​​pakket op te slaan package.json als dev-afhankelijkheden:

npm install "$package" --save-dev

Wanneer je rent npm install het zal beide installeren devDependencies en dependencies. Om installatie te voorkomen devDependencies rennen:

npm install --production

48
2018-01-08 06:41



Er zijn enkele modules en pakketten die alleen nodig zijn voor ontwikkeling, die niet nodig zijn in de productie. Zoals het zegt het in de documentatie:

Als iemand van plan is om uw module in hun programma te downloaden en te gebruiken, dan willen ze waarschijnlijk niet het externe test- of documentatiekader dat u gebruikt, downloaden of bouwen. In dit geval is het het beste om deze extra items in een devDependencies-hash op te nemen.


29
2017-09-18 14:59



afhankelijkheden
Afhankelijkheden die uw project moet uitvoeren, zoals een bibliotheek met functies die u vanuit uw code aanroept.
Ze zijn transitief geïnstalleerd (als A afhangt van B hangt af van C, npm installeren op A zal B en C installeren).
Voorbeeld: lodash: uw project noemt enkele lodash-functies.

devDependencies
Afhankelijkheden die u alleen tijdens de ontwikkeling of het vrijgeven nodig heeft, zoals compilers die uw code gebruiken en in javascript compileren, frameworks testen of documentatie-generators.
Ze zijn niet transitief geïnstalleerd (als A afhankelijk is van B dev-afhankelijk van C, npm installeren op A zal alleen B worden geïnstalleerd).
Voorbeeld: grunt: uw project gebruikt grunt om zichzelf te bouwen.

peerDependencies
Afhankelijkheden waarmee uw project in het bovenliggende project wordt gekoppeld of gewijzigd, meestal een plug-in voor een andere bibliotheek of tool. Het is gewoon bedoeld als een controle, ervoor te zorgen dat het bovenliggende project (project dat zal afhangen van uw project) afhankelijk is van het project waar u aan vasthoudt. Dus als u een plug-in C maakt die functionaliteit toevoegt aan bibliotheek B, moet iemand die een project A maakt afhankelijk zijn van B als deze afhankelijk is van C.
Ze zijn niet geïnstalleerd (tenzij npm <3), ze worden alleen gecontroleerd voor.
Voorbeeld: grunt: uw project voegt functionaliteit toe aan grunt en kan alleen worden gebruikt voor projecten die grunt gebruiken.

Deze documentatie legt heel goed de afhankelijkheid van peers uit: https://nodejs.org/en/blog/npm/peer-dependencies/ 

Ook is de npm-documentatie in de loop van de tijd verbeterd en heeft nu betere uitleg over de verschillende soorten afhankelijkheden: https://github.com/npm/npm/blob/master/doc/files/package.json.md#devdependencies


18
2017-09-05 17:27



Een eenvoudige verklaring die me duidelijker maakte, is:

Wanneer u uw app implementeert, moeten modules in afhankelijkheden worden geïnstalleerd of werkt uw app niet. Modules in devDependencies hoeven niet op de productieserver te worden geïnstalleerd, aangezien u zich niet op die machine ontwikkelt. link


8
2017-09-29 15:36



Ik wil graag mijn mening over deze afhankelijkheden uitleg toevoegen aan het antwoord

  • dependencies worden gebruikt voor direct gebruik in uw codebase, dingen die meestal in de productiecode terechtkomen, of stukjes code
  • devDependencies worden gebruikt voor het bouwproces, hulpprogramma's die u helpen bij het beheren van de eindcode, testmodules van derden (bijvoorbeeld webpack-spullen)

6
2018-02-16 11:40



Wanneer u probeert een npm-pakket te distribueren, moet u het niet gebruiken dependencies. In plaats daarvan moet je overwegen om het toe te voegen peerDependencies of verwijder het van dependencies.


0
2017-07-06 12:47