npm-install
Sinossi
npm install (senza args, in package dir)npm install <name>npm install <name><tag>npm install <name><versione>npm install <name>< gamma di versioni>npm install <alias>@npm:< nome>npm install <git-host><git-user><repo-nome>npm install < url repogit>npm install <tarball file>npm install <tarball url>npm install <folder>alias: npm i, npm addopzioni comuni:
Descrizione
Questo comando installa un pacchetto e tutti i pacchetti da cui dipende. Se il pacchetto ha un file package-lock o shrinkwrap, l’installazione delle dipendenze sarà guidata da quello, con un npm-shrinkwrap.json
che ha la precedenza se entrambi i file esistono. Vedere package-lock.json e npm shrinkwrap
.
Un package
è:
- a) una cartella contenente un programma descritto da un file
package.json
- b) un tarball gzippato contenente (a)
- c) un url che risolve a (b)
- d) un
<name>@<version>
che è pubblicato sul registro (vediregistry
) con (c) - e) un
<name>@<tag>
(vederenpm dist-tag
) che punta a (d) - f) un
<name>
che ha un tag “latest” che soddisfa (e) - g) un
<git remote url>
che si risolve in (a)
Anche se non pubblichi mai il tuo pacchetto, si possono ancora ottenere molti benefici dall’uso di npm se si vuole solo scrivere un programma su nodo (a), e forse se si vuole anche essere in grado di installarlo facilmente altrove dopo averlo impacchettato in un tarball (b).
-
npm install
(nella directory del pacchetto, senza argomenti):Installa le dipendenze nella cartella locale node_modules.
In modalità globale (cioè con
-g
o--global
aggiunto al comando), installa il contesto del pacchetto corrente (cioè la directory di lavoro corrente) come un pacchetto globale.Per default,
npm install
installerà tutti i moduli elencati come dipendenze inpackage.json
.Con il flag
--production
(o quando la variabile d’ambienteNODE_ENV
è impostata suproduction
), npm non installa i moduli elencati indevDependencies
. Per installare tutti i moduli elencati sia independencies
che indevDependencies
quando la variabile d’ambienteNODE_ENV
è impostata suproduction
, puoi usare--production=false
.NOTA: Il flag
--production
non ha un significato particolare quando si aggiungono dipendenze a un progetto. -
npm install <folder>
:Installa il pacchetto nella directory come symlink nel progetto corrente. Se
<folder>
si trova all’interno della radice del progetto, le sue dipendenze possono essere portate al livello superiorenode_modules
come farebbero per altri tipi di dipendenze. -
npm install <tarball file>
:Installare un pacchetto che si trova sul filesystem. Nota: se vuoi solo collegare una directory dev alla tua root di npm, puoi farlo più facilmente usando
npm link
.Requisiti del tarball:
-
Il nome del file deve usare
.tar
.tar.gz
, o.tgz
come estensione. -
Il contenuto del pacchetto dovrebbe risiedere in una sottocartella all’interno del tarball (di solito si chiama
package/
). npm rimuove un livello di directory durante l’installazione del pacchetto (viene eseguito un equivalente ditar x --strip-components=1
). -
Il pacchetto deve contenere un file
package.json
con proprietàname
eversion
.Esempio:
npm install ./package.tgz
-
-
npm install <tarball url>
:Recupera l’url del tarball e poi installalo. Per distinguere tra questa e le altre opzioni, l’argomento deve iniziare con “http://” o “https://”
Esempio:
npm install https://github.com/indexzero/forever/tarball/v0.5.6 -
npm install <name>
:Fate un’installazione
<name>@<tag>
, dove<tag>
è la configurazione del “tag”. (Seeconfig
. Il valore predefinito della configurazione èlatest
.)Nella maggior parte dei casi, questo installerà la versione dei moduli etichettati come
latest
nel registro di npm.Esempio:
npm install sax -
npm install <alias>@npm:<name>
:Installa un pacchetto sotto un alias personalizzato. Permette versioni multiple di un pacchetto con lo stesso nome fianco a fianco, nomi di importazione più convenienti per pacchetti altrimenti lunghi e l’uso di sostituzioni git forks o pacchetti npm forked come sostituzioni. L’aliasing funziona solo sul tuo progetto e non rinomina i pacchetti nelle dipendenze transitive; gli alias dovrebbero seguire le convenzioni di denominazione indicate in
validate-npm-package-name
.Esempi:
npm install my-react@npm:reactnpm install jquery2@npm:jquery@2npm install jquery3@npm:jquery@3npm install npa@npm:npm-package-arg
`npm install` salva qualsiasi pacchetto specificato in `dependencies` per impostazione predefinita.Inoltre, è possibile controllare dove e come vengono salvati con alcuniflags aggiuntivi:* `-P, --save-prod`: Il pacchetto apparirà nelle tue `dipendenze`. Questo è ildefault a meno che non siano presenti `-D` o `-O`.* `-D, --save-dev`: Il pacchetto apparirà nelle tue `devDependencies`.* `-O, --save-optional`: Il pacchetto apparirà nelle tue `optionalDependencies`.* `--no-save`: Impedisce il salvataggio nelle `dipendenze`.Quando si usa una delle opzioni precedenti per salvare le dipendenze nel propriopackage.json, ci sono due flag aggiuntivi e opzionali:* `-E, --save-exact`: Le dipendenze salvate saranno configurate con unaversione esatta piuttosto che usare l'operatore predefinito di semver di npm.* `-B, --save-bundle`: Le dipendenze salvate saranno anche aggiunte alla tua lista `bundleDependencies`.Inoltre, se hai un `npm-shrinkwrap.json` o `package-lock.json` allora anche questoverrà aggiornato.<scope>` è opzionale. Il pacchetto sarà scaricato dal registroassociato all'ambito specificato. Se nessun registro è associato al'ambito dato, viene assunto il registro predefinito. Vedere (/cli/v6/using-npm/scope).Nota: se non si include il simbolo @ sul nome dello scope, npm lointerpreterà invece come un repository GitHub, vedere sotto. I nomi degli scopedevono anche essere seguiti da una barra.Esempi:``bashnpm install saxnpm install githubname/reponamenpm install @myorg/privatepackagenpm install node-toccare -salva-devnpm install dtrace-provider --save-optionalnpm install readable-stream --save-exactnpm install ansi-regex --save-bundle```**Nota**: Se c'è un file o una cartella chiamata `<nome>` nella directory correntelavoro, allora cercherà di installare quella, e cercherà solo direcuperare il pacchetto per nome se non è valido.
-
npm install <name>@<tag>
:Installa la versione del pacchetto a cui fa riferimento il tag specificato.Se il tag non esiste nei dati di registro per quel pacchetto, allora questo fallirà.
Esempio:
npm install sax@latestnpm install @myorg/mypackage@latest -
npm install <name>@<version>
:Installa la versione specificata del pacchetto. Questo fallirà se la versione non è stata pubblicata nel registro.
Esempio:
npm install [email protected]npm install @myorg/[email protected]
npm install <name>@<version range>
:
Installa una versione del pacchetto corrispondente all’intervallo di versioni specificato. Questo seguirà le stesse regole per risolvere le dipendenze descritte in package.json
.
Si noti che la maggior parte degli intervalli di versione devono essere messi tra virgolette in modo che la shell li tratti come un singolo argomento.
Esempio:
npm install <git remote url>
:
Installa il pacchetto dal provider git ospitato, clonandolo con git
.Per un url git remote completo, verrà tentato solo quell’URL.
<protocollo><hostname><path>
<protocol>
è uno dei git
git+ssh
git+http
git+https
, ogit+file
.
Se viene fornito #<commit-ish>
, sarà usato per clonare esattamente quel commit. Se il commit-ish ha il formato #semver:<semver>
<semver>
può essere qualsiasi intervallo di seme valido o versione esatta, e npm cercherà qualsiasi tag o refs che corrisponda a quell’intervallo nel repository remoto, proprio come farebbe per una dipendenza dal registro. Se né #<commit-ish>
né #semver:<semver>
sono specificati, allora viene usato il ramo predefinito del repository.
Se il repository fa uso di sottomoduli, anche questi saranno clonati.
Se il pacchetto da installare contiene uno script prepare
, i suoidependencies
e devDependencies
saranno installati, e il preparescript sarà eseguito, prima che il pacchetto sia impacchettato e installato.
Le seguenti variabili d’ambiente git sono riconosciute da npm e saranno aggiunte all’ambiente quando si esegue git:
-
GIT_ASKPASS
-
GIT_EXEC_PATH
-
GIT_PROXY_COMMAND
-
GIT_SSH
-
GIT_SSH_COMMAND
-
GIT_SSL_CAINFO
-
GIT_SSL_NO_VERIFY
Vedi la pagina man di git per dettagli.
Esempi:
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>
:
Installare il pacchetto a https://github.com/githubname/githubrepo
tentando di clonarlo usando git
.
Se viene fornito #<commit-ish>
, sarà usato per clonare esattamente quel commit. Se il commit-ish ha il formato #semver:<semver>
<semver>
può essere qualsiasi intervallo di seme valido o versione esatta, e npm cercherà qualsiasi tag o refs che corrisponda a quell’intervallo nel repository remoto, proprio come farebbe per una dipendenza dal registro. Se né #<commit-ish>
né #semver:<semver>
sono specificati, allora viene usato master
.
Come per le normali dipendenze git, dependencies
e devDependencies
saranno installati se il pacchetto ha uno script prepare
, prima che il pacchetto sia installato.
Esempi:
npm install mygithubuser/myprojectnpm install github:mygithubuser/myproject
npm install gist:<gistID>
:
Installare il pacchetto a https://gist.github.com/gistID
cercando di clonarlo usando git
. Il nome utente GitHub associato al gist è facoltativo e non sarà salvato in package.json
.
Come per le normali dipendenze git, dependencies
e devDependencies
saranno installati se il pacchetto ha uno script prepare
, prima che il pacchetto venga installato.
Esempio:
npm install gist:
npm install bitbucket:<bitbucketname>/<bitbucketrepo>
:
Installare il pacchetto a https://bitbucket.org/bitbucketname/bitbucketrepo
tentando di clonarlo usando git
.
Se viene fornito #<commit-ish>
, sarà usato per clonare esattamente quel commit. Se il commit-ish ha il formato #semver:<semver>
<semver>
può essere qualsiasi intervallo di seme valido o versione esatta, e npm cercherà qualsiasi tag o refs che corrisponda a quell’intervallo nel repository remoto, proprio come farebbe per una dipendenza dal registro. Se né #<commit-ish>
né #semver:<semver>
sono specificati, allora viene usato master
.
Come per le normali dipendenze git, dependencies
e devDependencies
saranno installati se il pacchetto ha uno script prepare
, prima che il pacchetto sia installato.
Esempio:
npm install bitbucket:mybitbucketuser/myproject
npm install gitlab:<gitlabname>/<gitlabrepo>
:
Installare il pacchetto a https://gitlab.com/gitlabname/gitlabrepo
tentando di clonarlo usando git
.
Se viene fornito #<commit-ish>
, sarà usato per clonare esattamente quel commit. Se il commit-ish ha il formato #semver:<semver>
<semver>
può essere qualsiasi intervallo di seme valido o versione esatta, e npm cercherà qualsiasi tag o refs che corrisponda a quell’intervallo nel repository remoto, proprio come farebbe per una dipendenza dal registro. Se né #<commit-ish>
né #semver:<semver>
sono specificati, allora viene usato master
.
Come per le normali dipendenze git, dependencies
e devDependencies
saranno installati se il pacchetto ha uno script prepare
, prima che il pacchetto venga installato.
Esempio:
npm install gitlab:mygitlabuser/myprojectnpm install gitlab:myusr/myproj#semver:^5.0
È possibile combinare più argomenti, e anche più tipi di argomenti.Per esempio:
npm install sax@"><0.2.0" supervisore di banco
L’argomento --tag
si applica a tutti gli obiettivi di installazione specificati. Se esiste un atag con il nome dato, la versione etichettata è preferita alle newerversions.
L’argomento --dry-run
riporterà nel solito modo ciò che l’installazione avrebbe fatto senza installare effettivamente nulla.
L’argomento --package-lock-only
aggiornerà solo il package-lock.json
, invece di controllare node_modules
e scaricare le dipendenze.
L’argomento -f
o --force
forzerà npm a recuperare risorse remote anche se esiste una copia locale su disco.
npm install sax --force
L’argomento --no-fund
nasconderà il messaggio visualizzato alla fine di ogni installazione che riconosce il numero di dipendenze in cerca di finanziamento.Vedere npm-fund(1)
L’argomento -g
o --global
farà sì che npm installi il pacchetto a livello globale invece che locale. Vedi cartelle.
L’argomento --global-style
farà sì che npm installi il pacchetto nella tua cartella locale node_modules
con lo stesso layout che usa con la cartella node_modules
globale. Solo le vostre dipendenze dirette appariranno innode_modules
e tutto ciò da cui dipendono sarà appiattito nelle loronode_modules
cartelle. Questo ovviamente eliminerà un po’ di deduping.
L’argomento --ignore-scripts
farà sì che npm non esegua anyscripts definiti nel package.json. Vedi scripts
.
L’argomento --legacy-bundling
farà sì che npm installi il pacchetto in modo che le versioni di npm precedenti alla 1.4, come quella inclusa in node 0.8, possano installarlo. Questo elimina ogni deduplicazione automatica.
L’argomento --link
farà sì che npm colleghi le installazioni globali nello spazio locale in alcuni casi.
L’argomento --no-bin-links
impedirà a npm di creare collegamenti simbolici per qualsiasi binario che il pacchetto potrebbe contenere.
L’argomento --no-optional
impedirà l’installazione delle dipendenze opzionali.
L’argomento --no-shrinkwrap
, che ignorerà un blocco di pacchetto disponibile o un file shrinkwrap e userà il file package.json.
L’argomento --no-package-lock
impedirà a npm di creare unpackage-lock.json
file. Quando si esegue con il package-lock disabilitato npm non pota automaticamente i moduli di node durante l’installazione.
L’argomento --nodedir=/path/to/node/source
permetterà a npm di trovare il codice sorgente di node in modo che npm possa compilare i moduli nativi.
L’argomento --only={prod|dev}
farà sì che solodevDependencies
o solo non-devDependencies
venga installato indipendentemente dall’argomento NODE_ENV
.
L’argomento --no-audit
può essere usato per disabilitare l’invio di rapporti di audit ai registri configurati. Vedere npm-audit
per i dettagli su cosa viene inviato.
Vedi config
. Molti dei parametri di configurazione hanno qualche effetto sull’installazione, dato che è la maggior parte di ciò che fa npm.
Algoritmo
Per installare un pacchetto, npm usa il seguente algoritmo:
carica l'albero di node_modules esistente dal discoclona l'alberorecupera il pacchetto.json e metadati assortiti e aggiungerlo al clonepercorrere il clone e aggiungere eventuali dipendenze mancantile dipendenze saranno aggiunte il più vicino possibile alla cimasenza rompere nessun altro moduloconfrontare l'albero originale con l'albero clonato e fare una lista diazioni da prendere per convertire uno nell'altroeseguire tutte le azioni, i primi più profonditipi di azioni sono installare, aggiornare, rimuovere e spostare
Per questa package{dep}
struttura: A{B,C}, B{C}, C{D}
, questo algoritmo produce:
A+-- B+-- C+-- D
Questo è, la dipendenza da B a C è soddisfatta dal fatto che A ha già causato l’installazione di C ad un livello superiore. D è ancora installato al livello più alto perché nulla è in conflitto con esso.
Per A{B,C}, B{C,D@1}, C{D@2}
, questo algoritmo produce:
A+-- B+-- C`-- D@2+-- D@1
Perché il D@1 di B sarà installato nel livello superiore, C ora deve installare D@2 privatamente per se stesso. Questo algoritmo è deterministico, ma possono essere prodotti alberi diversi se due dipendenze sono richieste per l’installazione in un ordine diverso.
Vedi folders per una descrizione più dettagliata delle specifiche strutture di cartelle che npm crea.
Limitazioni dell’algoritmo di installazione di npm
npm rifiuta di installare qualsiasi pacchetto con un nome identico al pacchetto corrente. Questo può essere annullato con il flag --force
, ma nella maggior parte dei casi può essere semplicemente affrontato cambiando il nome del pacchetto locale.
Ci sono alcuni casi limite molto rari e patologici in cui un ciclo può far sì che npm cerchi di installare un albero infinito di pacchetti. Ecco il caso più semplice:
A -> B -> A' -> B' -> A -> B -> A' -> B' -> A -> ...
dove A
è una qualche versione di un pacchetto, e A'
è una versione diversa dello stesso pacchetto. Poiché B
dipende da una versione diversa di A
da quella che è già nell’albero, deve installare una copia separata. Lo stesso vale per A'
, che deve installare B'
. Poiché B'
dipende dalla versione originale di A
, che è stata sovrascritta, il ciclo cade in un regresso infinito.
Per evitare questa situazione, npm rifiuta categoricamente di installare qualsiasiname@version
che sia già presente da qualche parte nell’albero degli antenati di packagefolder. Una soluzione più corretta, ma più complessa, sarebbe quella di fare un link simbolico alla versione esistente nella nuova posizione. Se questo dovesse mai interessare un caso d’uso reale, sarà oggetto di indagine.
Vedi anche
- 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