npm-install
Synopsis
npm install (met geen args, in package dir)npm install <naam>npm install <naam><tag>npm install <naam><versie>npm install <naam><versiebereik>npm install <alias>@npm:<naam>npm install <git-host><git-user><repo-naam>npm install <git repo url>npm install <tarball bestand>npm install <tarball url>npm install <map>aliassen: npm i, npm addgemeenschappelijke opties:
Beschrijving
Deze opdracht installeert een pakket, en alle pakketten waarvan het afhankelijk is. Als het pakket een package-lock of shrinkwrap bestand heeft, zal de installatie van afhankelijkheden daardoor gestuurd worden, met een npm-shrinkwrap.json
die voorrang heeft als beide bestanden bestaan. Zie package-lock.json en npm shrinkwrap
.
Een package
is:
- a) een map met een programma dat wordt beschreven door een
package.json
bestand - b) een gzipped tarball die (a)
- c) een url die verwijst naar (b)
- d) een
<name>@<version>
die in het register is gepubliceerd (zieregistry
) met (c) - e) een
<name>@<tag>
(zie ) die verwijst naar (d) - f) een
<name>
die een “latest” tag heeft die voldoet aan (e) - g) een
<git remote url>
die verwijst naar (a)
Zelfs als je je pakket nooit publiceert, kun je nog steeds veel voordelen halen uit het gebruik van npm als je gewoon een node programma wilt schrijven (a), en misschien als je het ook gemakkelijk elders wilt kunnen installeren nadat je het hebt ingepakt in een tarball (b).
-
npm install
(in package directory, geen argumenten):Installeer de dependencies in de lokale node_modules folder.
In globale modus (d.w.z., met
-g
of--global
toegevoegd aan het commando), installeert het de huidige pakket context (d.w.z., de huidige werkdirectory) als een globaal pakket.Standaard installeert
npm install
alle modules die als afhankelijkheden inpackage.json
staan.Met de
--production
vlag (of wanneer deNODE_ENV
omgevingsvariabele is ingesteld opproduction
), zal npm geen modules installeren die indevDependencies
staan. Om alle modules vermeld in zoweldependencies
alsdevDependencies
te installeren wanneerNODE_ENV
omgevingsvariabele is ingesteld opproduction
, kunt u--production=false
gebruiken.Opmerking: De vlag
--production
heeft geen bijzondere betekenis bij het toevoegen van adependency aan een project. -
npm install <folder>
:Installeer het pakket in de directory als een symlink in het huidige project. De afhankelijkheden worden geïnstalleerd voordat het wordt gekoppeld. Als
<folder>
in de root van uw project zit, kunnen de afhankelijkheden ervan naar hettoplevelnode_modules
worden getild, zoals dat bij andere soorten afhankelijkheden het geval zou zijn. -
npm install <tarball file>
:Installeer een pakket dat op het bestandssysteem staat. Opmerking: als u alleen een dev directory in uw npm root wilt linken, kunt u dit eenvoudiger doen door
npm link
te gebruiken.Eisen aan de tarball:
-
In de bestandsnaam moet
.tar
.tar.gz
, of.tgz
worden gebruikt als extensie. -
De inhoud van het pakket moet zich in een submap in de tarball bevinden (meestal heet deze
package/
). npm stript één maplaag bij het installeren van het pakket (een equivalent vantar x --strip-components=1
wordt uitgevoerd). -
Het pakket moet een
package.json
bestand bevatten metname
enversion
eigenschappen.Voorbeeld:
npm install ./package.tgz
-
-
npm install <tarball url>
:Haal de tarball url op, en installeer deze vervolgens. Om onderscheid te maken tussen deze en andere opties, moet het argument beginnen met “http://” of “https://”
Voorbeeld:
npm install https://github.com/indexzero/forever/tarball/v0.5.6 -
npm install <name>
:Doe een
<name>@<tag>
installatie, waarbij<tag>
de “tag” config is. (Seeconfig
. De standaardwaarde van de config islatest
.)In de meeste gevallen zal dit de versie van de modules installeren die als
latest
in het npm register staan.Voorbeeld:
npm install sax
npm install <alias>@npm:<name>
:
Installeer een pakket onder een aangepaste alias. Maakt meerdere versies van een pakket met dezelfde naam naast elkaar mogelijk, handigere importnamen voor pakketten met anders lange namen en het gebruik van vervangingen door git forks of gevorkte npm pakketten als vervangingen. Aliasing werkt alleen op uw project en hernoemt geen pakketten in transitieve afhankelijkheden. Aliassen moeten de naamgevingsconventies volgen zoals vermeld invalidate-npm-package-name
.
Voorbeelden:
npm install my-react@npm:reactnpm install jquery2@npm:jquery@2npm install jquery3@npm:jquery@3npm install npa@npm:npm-package-arg
`npm install` slaat standaard alle opgegeven pakketten op in `dependencies`.Extra kunt u bepalen waar en hoe ze worden opgeslagen met enkeleadditionele vlaggen:* `-P, --save-prod`: Pakket zal verschijnen in uw `dependencies`. Dit is destandaard tenzij `-D` of `-O` aanwezig zijn.* `-D, --save-dev`: Pakket zal verschijnen in uw `devDependencies`.* `-O, --save-optional`: Pakket verschijnt in uw `optionalDependencies`.* `--no-save`: Voorkomt opslaan in `dependencies`.Wanneer u een van de bovenstaande opties gebruikt om dependencies op te slaan in uwpackage.json, zijn er twee extra, optionele vlaggen:* `-E, --save-exact`: Opgeslagen afhankelijkheden zullen worden geconfigureerd met eenexacte versie in plaats van gebruik te maken van npm's standaard semver rangeoperator.* `-B, --save-bundle`: Opgeslagen afhankelijkheden worden ook toegevoegd aan uw `bundleDependencies` lijst.Verder, als u een `npm-shrinkwrap.json` of `package-lock.json` hebt, danwordt deze ook bijgewerkt.<scope>` is optioneel. Het pakket wordt gedownload van het registerdat geassocieerd is met het opgegeven bereik. Als er geen register is gekoppeld aanhet opgegeven bereik wordt het standaardregister aangenomen. Zie (/cli/v6/using-npm/scope).Note: als u het @-symbool niet toevoegt aan uw scopienaam, zal npmdit interpreteren als een GitHub-repository in plaats daarvan, zie hieronder. Scopes namenmoeten ook gevolgd worden door een schuine streep.Voorbeelden:``bashnpm install saxnpm install githubname/reponamenpm install @myorg/privatepackagenpm install node-tik --save-devnpm install dtrace-provider --save-optionalnpm install readable-stream --save-exactnpm install ansi-regex --save-bundle``**Note**: Als er een bestand of map met de naam `<naam>` in de huidigewerkdirectory staat, dan wordt geprobeerd die te installeren, en wordt alleen geprobeerdhet pakket op naam af te halen als deze niet geldig is.
-
npm install <name>@<tag>
:Installeer de versie van het pakket waarnaar wordt verwezen door de opgegeven tag.Als de tag niet bestaat in de registergegevens voor dat pakket, dan zal dit mislukken.
Voorbeeld:
npm install sax@latestnpm install @myorg/mypackage@latest -
npm install <name>@<version>
:Installeer de opgegeven versie van het pakket. Dit mislukt als de versie niet in het register is gepubliceerd.
Voorbeeld:
npm install [email protected]npm install @myorg/[email protected] -
npm install <name>@<version range>
:Installeer een versie van het pakket die overeenkomt met het opgegeven versiebereik. Dit volgt dezelfde regels voor het oplossen van afhankelijkheden als beschreven in
package.json
.Merk op dat de meeste versiebereiken tussen aanhalingstekens moeten worden gezet, zodat uw shell ze als een enkel argument zal behandelen.
Voorbeeld:
npm install sax@"><0.2.0"npm install @myorg/privatepackage@"><0.2.0" -
npm install <git remote url>
:Installeert het pakket van de gehoste git provider, door het te klonen met
git
.Voor een volledige git remote url, zal alleen die URL geprobeerd worden.<protocol><hostname><path><protocol>
is een vangit
git+ssh
git+http
git+https
, ofgit+file
.Als
#<commit-ish>
is meegegeven, zal het gebruikt worden om precies die commit te klonen. Als de commit-ish het formaat#semver:<semver>
heeft, dan kan<semver>
elk geldig semver bereik of exacte versie zijn, en npm zal zoeken naar alle tags of refs die overeenkomen met dat bereik in het remote repository, net zoals het zou doen voor een register afhankelijkheid. Als geen van beide#<commit-ish>
of#semver:<semver>
is gespecificeerd, dan wordt de standaard tak van de repository gebruikt.Als de repository gebruik maakt van submodules, dan zullen die submodules ook worden gekloond.
Als het te installeren pakket een
prepare
script bevat, dan worden dedependencies
endevDependencies
daarvan geïnstalleerd, en wordt het preparescript uitgevoerd, voordat het pakket wordt ingepakt en geïnstalleerd.De volgende git omgevingsvariabelen worden door npm herkend en zullen aan de omgeving worden toegevoegd bij het uitvoeren van git:
-
GIT_ASKPASS
-
GIT_EXEC_PATH
-
GIT_PROXY_COMMAND
-
GIT_SSH
-
GIT_SSH_COMMAND
-
GIT_SSL_CAINFO
-
GIT_SSL_NO_VERIFY
Zie de git man page voor meer informatie.
Voorbeelden:
npm install git+ssh://[email protected]:npm/cli.git#v1.0.27npm install git+ssh://[email protected]:npm/cli#semver:^5.0npm install git+https://[email protected]/npm/cli.gitnpm install git://github.com/npm/cli.git#v1.0.27GIT_SSH_COMMAND='ssh -i ~/.ssh/custom_ident' npm install git+ssh://[email protected]:npm/cli.git
-
-
npm install <githubname>/<githubrepo>
: -
npm install github:<githubname>/<githubrepo>
:Installeer het pakket op
https://github.com/githubname/githubrepo
door te proberen het te klonen metgit
.Als
#<commit-ish>
is opgegeven, zal het gebruikt worden om precies die commit te clonen. Als de commit-ish het formaat#semver:<semver>
heeft, dan kan<semver>
elk geldig semver bereik of exacte versie zijn, en npm zal zoeken naar alle tags of refs die overeenkomen met dat bereik in het remote repository, net zoals het zou doen voor een register afhankelijkheid. Als#<commit-ish>
of#semver:<semver>
niet zijn gespecificeerd, dan wordtmaster
gebruikt.Net als bij gewone git dependencies worden
dependencies
endevDependencies
geinstalleerd als het pakket eenprepare
script heeft, voordat het pakket klaar is met installeren.Voorbeelden:
npm install mygithubuser/myprojectnpm install github:mygithubuser/myproject -
npm install gist:<gistID>
:Installeer het pakket op
https://gist.github.com/gistID
door te proberen het te klonen metgit
. De GitHub gebruikersnaam geassocieerd met de gist is optioneel en zal niet worden opgeslagen inpackage.json
.Net als bij reguliere git dependencies, zullen
dependencies
endevDependencies
geïnstalleerd worden als het pakket eenprepare
script heeft, voordat het pakket klaar is met installeren.Voorbeeld:
npm install gist: -
npm install bitbucket:<bitbucketname>/<bitbucketrepo>
:Installeer het pakket op
https://bitbucket.org/bitbucketname/bitbucketrepo
door te proberen het te klonen metgit
.Als
#<commit-ish>
is meegegeven, zal het gebruikt worden om precies die commit te clonen. Als de commit-ish het formaat#semver:<semver>
heeft, dan kan<semver>
elk geldig semver bereik of exacte versie zijn, en npm zal zoeken naar alle tags of refs die overeenkomen met dat bereik in het remote repository, net zoals het zou doen voor een register afhankelijkheid. Als#<commit-ish>
of#semver:<semver>
niet zijn gespecificeerd, dan wordtmaster
gebruikt.Net als bij gewone git dependencies,
dependencies
endevDependencies
worden geinstalleerd als het pakket eenprepare
script heeft, voordat het pakket klaar is met installeren.Voorbeeld:
npm install bitbucket:mybitbucketuser/myproject -
npm install gitlab:<gitlabname>/<gitlabrepo>
:Installeer het pakket op
https://gitlab.com/gitlabname/gitlabrepo
door te proberen het te klonen metgit
.Als
#<commit-ish>
is meegegeven, zal het gebruikt worden om precies die commit te clonen. Als de commit-ish het formaat#semver:<semver>
heeft, dan kan<semver>
elk geldig semver bereik of exacte versie zijn, en npm zal zoeken naar alle tags of refs die overeenkomen met dat bereik in het remote repository, net zoals het zou doen voor een register afhankelijkheid. Als#<commit-ish>
of#semver:<semver>
niet zijn gespecificeerd, dan wordtmaster
gebruikt.Net als bij gewone git dependencies,
dependencies
endevDependencies
worden geinstalleerd als het pakket eenprepare
script heeft, voordat het pakket klaar is met installeren.Voorbeeld:
npm install gitlab:mygitlabuser/myprojectnpm install gitlab:myusr/myproj#semver:^5.0
Je mag meerdere argumenten combineren, en zelfs meerdere soorten argumenten.Bijvoorbeeld:
npm install sax@"><0.2.0" bank supervisor
Het --tag
argument zal van toepassing zijn op alle opgegeven installatiedoelen.
Het --dry-run
argument rapporteert op de gebruikelijke manier wat de installatie zou hebben gedaan zonder daadwerkelijk iets te installeren.
Het --package-lock-only
argument zal alleen de package-lock.json
bijwerken, in plaats van node_modules
te controleren en dependencies te downloaden.
Het -f
of --force
argument zal npm forceren om bronnen op afstand op te halen, zelfs als er al een lokale kopie op schijf bestaat.
npm install sax --force
Het --no-fund
-argument verbergt de melding die aan het eind van elke installatie wordt weergegeven en die het aantal afhankelijkheden aangeeft dat op zoek is naar financiering.Zie npm-fund(1)
Het -g
of --global
argument zal ervoor zorgen dat npm het pakket globaal installeert in plaats van lokaal.
Het --global-style
argument zorgt ervoor dat npm het pakket in uw lokale node_modules
map installeert met dezelfde layout die het gebruikt met deglobale node_modules
map. Enkel uw rechtstreekse afhankelijkheden zullen getoond worden innode_modules
en alles waar ze van afhangen zal plat getoond worden in hunnode_modules
folders. Dit zal uiteraard wat deduperen elimineren.
Het --ignore-scripts
argument zal ervoor zorgen dat npm geen scripts uitvoert die gedefinieerd zijn in de package.json. Zie scripts
.
Het --legacy-bundling
argument zorgt ervoor dat npm het pakket zo installeert dat versies van npm van vóór 1.4, zoals de versie die met node 0.8 wordt meegeleverd, het pakket kunnen installeren. Dit elimineert alle automatische deduping.
Het --link
argument zorgt ervoor dat npm in sommige gevallen globale installaties koppelt aan de lokale ruimte.
Het --no-bin-links
argument zorgt ervoor dat npm geen symlinks aanmaakt voor alle binaries die het pakket kan bevatten.
Het --no-optional
argument zal voorkomen dat optionele afhankelijkheden worden geïnstalleerd.
Het --no-shrinkwrap
argument, dat een availablepackage lock of shrinkwrap bestand zal negeren en in plaats daarvan de package.json in plaats daarvan.
Het --no-package-lock
argument zal voorkomen dat npm eenpackage-lock.json
bestand aanmaakt. Als package-lock’s zijn uitgeschakeld, zal npm niet automatisch node-modules verwijderen tijdens de installatie.
Het --nodedir=/path/to/node/source
argument zorgt ervoor dat npm de broncode van node kan vinden, zodat npm native modules kan compileren.
Het --only={prod|dev}
argument zal ervoor zorgen dat ofwel alleendevDependencies
of alleen nietdevDependencies
worden geïnstalleerd, ongeacht de NODE_ENV
.
Het --no-audit
argument kan worden gebruikt om het versturen van audit rapporten naar de geconfigureerde registries uit te schakelen. Zie npm-audit
voor details over wat wordt verzonden.
Zie config
. Veel van de configuratieparameters hebben een effect op de installatie, omdat dat het meeste is wat npm doet.
Algoritme
Om een pakket te installeren, gebruikt npm het volgende algoritme:
laad de bestaande node_modules-boom van schijfkloon de boomhaal het pakket op.json en geassorteerde metadata op en voeg deze toe aan de kloondoorloop de kloon en voeg eventuele ontbrekende afhankelijkheden toeafhankelijkheden worden zo dicht mogelijk bij de top toegevoegdzonder andere modules te brekenvergelijk de originele boom met de gekloonde boom en maak een lijst vanacties die moeten worden ondernomen om de ene naar de andere om te zettenvoer alle acties uit, de diepste eerstesoorten acties zijn installeren, bijwerken, verwijderen en verplaatsen
Voor dezepackage{dep}
structuur:A{B,C}, B{C}, C{D}
, produceert dit algoritme:
A+-- B+-- C+-- D
Dat wil zeggen, aan de afhankelijkheid van B naar C wordt voldaan door het feit dat Aal er al voor heeft gezorgd dat C op een hoger niveau is geïnstalleerd. D wordt nog steeds op het hoogste niveau geïnstalleerd omdat er niets mee in strijd is.
Voor A{B,C}, B{C,D@1}, C{D@2}
, levert dit algoritme op:
A+-- B+-- C`-- D@2+-- D@1
Omdat B’s D@1 op het hoogste niveau zal worden geïnstalleerd, moet C nu D@2privé voor zichzelf installeren. Dit algoritme is deterministisch, maar er kunnen verschillende bomen ontstaan als twee dependencies in een andere volgorde worden aangevraagd voor installatie.
Zie mappen voor een meer gedetailleerde beschrijving van de specifieke mapstructuren die npm aanmaakt.
Beperkingen van npm’s installatiealgoritme
npm zal weigeren elk pakket te installeren met een identieke naam aan het huidige pakket. Dit kan worden opgeheven met de --force
vlag, maar in de meeste gevallen kan dit eenvoudig worden opgelost door de lokale pakketnaam te veranderen.
Er zijn enkele zeldzame en pathologische randgevallen waarbij een cyclus ervoor zorgt dat npm een oneindige boom van pakketten probeert te installeren. Hier is het eenvoudigste geval:
A -> B -> A' -> B' - > B' - > B' ->A' ->.> A -> B -> A' -> B' -> A -> ...
waar A
een versie van een pakket is, en A'
een andere versie van hetzelfde pakket is. Omdat B
afhankelijk is van een andere versie van A
dan de versie die al in de boom zit, moet het een aparte kopie installeren. Hetzelfde geldt voor A'
, die B'
moet installeren. Omdat B'
afhankelijk is van de oorspronkelijke versie van A
, die is overschreven, valt de cyclus in oneindige regress.
Om deze situatie te vermijden, weigert npm botweg om eenname@version
te installeren die al ergens in de boom van packagefolder voorouders aanwezig is. Een meer correcte, maar complexere, oplossing zou zijn om de bestaande versie te symlinken naar de nieuwe locatie. Als dit ooit een echte use-case raakt, zal het worden onderzocht.
See Also
- npm folders
- npm update
- npm audit
- npm fund
- npm link
- npm rebuild
- npm scripts
- npm build
- npm config
- npmrc
- npm registry
- npm dist-tag
- npm uninstall
- npm shrinkwrap
- package.json