Come installare un pacchetto npm direttamente da GitHub?


870

Cercare di installare moduli da Github porta a:

Errore ENOENT su package.json.

Facilmente riprodotto usando express:

npm install https://github.com/visionmedia/express genera errore.

npm install express lavori.

Perché non riesco a installare da github?

Ecco l'output della console:

npm http GET https://github.com/visionmedia/express.git
npm http 200 https://github.com/visionmedia/express.git
npm ERR! not a package /home/guym/tmp/npm-32312/1373176518024-0.6586997057311237/tmp.tgz
npm ERR! Error: ENOENT, open '/home/guym/tmp/npm-32312/1373176518024-0.6586997057311237/package/package.json'
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>

npm ERR! System Linux 3.8.0-23-generic
npm ERR! command "/usr/bin/node" "/usr/bin/npm" "install" "https://github.com/visionmedia/express.git"
npm ERR! cwd /home/guym/dev_env/projects_GIT/proj/somename
npm ERR! node -v v0.10.10
npm ERR! npm -v 1.2.25
npm ERR! path /home/guym/tmp/npm-32312/1373176518024-0.6586997057311237/package/package.json
npm ERR! code ENOENT
npm ERR! errno 34
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /home/guym/dev_env/projects_GIT/proj/somename/npm-debug.log
npm ERR! not ok code 0

1
Qualcuno può dare il formato devDependencies package.json?
Adam,

1
@Adam è possibile aggiungere "express": "github:visionmedia/express"alla "dependencies"sezione di package.json file, quindi eseguire: npm install(come menzionato di seguito)
Danny

@danny, non funziona per me. mi chiedo se ci fosse una cartella dist in quel repository express per abilitarlo.
ml242,

Risposte:


1159

Perché https://github.com/visionmedia/expressè l'URL di una pagina Web e non un modulo npm. Usa questo sapore:

git+https://git@github.com/visionmedia/express.git

o questo sapore se hai bisogno di SSH:

git+ssh://git@github.com/visionmedia/express.git

86
Puoi anche usare git+https://github.com/visionmedia/express.githttps anziché ssh.
Steve Willcock,

43
Si noti che repository si desidera installare deve essere un modulo NPM , deve contenere un package.jsonfile o altrimenti si otterrà questo errore: Error: ENOENT, open 'tmp.tgz-unpack/package.json'.
GabLeRoux,

20
E se volessi un ramo specifico
Kilianc,

3
L'unica soluzione che penso per ora è quella di specificare un commit con ... / express.git # commit
Gaston Sanchez

39
Vale la pena dire che potrebbe essere necessario sfuggire al #per utilizzare un ramo specifico dalla shell, vale a dire:npm install git+https://github.com/user/repo.git\#branch
mor

656

Puoi anche fare npm install visionmedia/expressl'installazione da Github

o

npm install visionmedia/express#branch

C'è anche il supporto per l'installazione direttamente da Gist, Bitbucket, Gitlab e una serie di altri formati specializzati. Guarda la npm install documentazione per tutti loro.


19
Cosa, senza specificare l'URL? Come fa npm a sapere quale servizio di hosting di sapore stai usando?
Jake Rayson,

22
@Jake Rayson: è possibile dalla versione 1.1.65 e funziona github.comsolo.
ezze,

5
Non ha funzionato per me su Windows - ha appena provato a installare da una sottocartella della mia directory corrente.
Jarrod Mosen,

7
Nota che questo non funziona su installazioni globali (es. Npm i repo / pkg -g) a partire da npm 1.4.28
user3751385

1
@ user3751385 Le installazioni globali sembrano funzionare in npm 3.3.8.
XåpplI'-I0llwlg'I -

170

Se git non è installato, possiamo provare

npm install --save https://github.com/Amitesh/gulp-rev-all/tarball/master

10
Bella risposta! Ha funzionato per me mentre altri comandi (da altre risposte) erano bloccati in una logica di recupero git.
Daniel Kmak,

2
Puoi anche usare i nomi dei tag al posto di master. Probabilmente è più sicuro farlo in questo modo.
apre il

4
Bello per quando lavori con le filiali, dovresti modificare la tua risposta per includere una risposta in formato generale, non l'ho notato /tarball/all'inizio
Lu Roman

2
Questa è l'unica risposta che ha funzionato per me durante l'installazione di una dipendenza dall'interno di un contenitore Docker.
Fela Maslen,

1
Questo è anche perfetto per non richiedere il download dell'intero repository. Grazie!
som

59

Aggiornamento settembre 2016

L'installazione dagli URL github https vanilla ora funziona:

npm install https://github.com/fergiemcdowall/search-index.git

EDIT 1: ci sono un paio di utenti che commentano che non puoi farlo per tutti i moduli perché stai leggendo da un sistema di controllo del codice sorgente, che potrebbe contenere codice non valido / non compilato / con errori. Quindi, per essere chiari (anche se dovrebbe essere ovvio): dato che il codice nel repository è in uno stato utilizzabile npm , ora puoi tranquillamente installarlo direttamente da github

EDIT 2: (21-10-2019) Stiamo vivendo il "picco Typescript / React / Babel", e quindi la compilazione JavaScript è diventata abbastanza comune. Se è necessario prendere in considerazione la compilazione, esaminare prepare. Detto questo, non è necessario compilare i moduli NPM , ed è saggio supporre che la compilazione non sia quella predefinita, specialmente per i moduli di nodo più vecchi (e possibilmente anche per quelli "ESNext" molto nuovi e all'avanguardia).


9
Non è possibile installare alcun pacchetto npm desiderato dal suo sorgente GitHub, a meno che il repository non includa una distcartella e la maggior parte no. Il problema a cui mi sono collegato è un bug npm: il prebuildpassaggio non viene eseguito durante l'installazione da GitHub. Ad esempio, prova a installare node-influx / node-influx .
Dan Dascalescu,

4
Repos senza distcartelle PUO 'essere installato da GitHub, ad esempio: npm install https://github.com/fergiemcdowall/search-index-adderfunziona perfettamente.
Fergie,

4
Bene, perché hai direttamente la fonte usabel /lib(come se avessi una cartella dist). Il mio punto è che l'inclusione dell'URL GitHub di un repository in package.jons non è garantita per l'installazione di quel repository. I moduli scritti in TypeScript, ad esempio, devono inserire il loro codice traspilato nel repository. In genere non lo fanno, ma piuttosto usano uno script di pre-pubblicazione per scaricare il codice .JS in una cartella dist, che viene caricata su npmjs.com.
Dan Dascalescu,

2
So che è un po 'tardi, ma il trucco è che npm non ha una mappatura da 1 a 1 sui repository Git. Alcuni progetti creano i loro file sorgente prima della pubblicazione piuttosto che prima del commit, il che significa che NON si trovano nel repository Git, ma sarebbero nel pacchetto npm - i progetti che lo fanno non funzioneranno direttamente da Git. Un altro esempio di come ciò possa fallire sono i repository macro: il progetto GitHub di Babel, ad esempio, include centinaia di singoli pacchetti npm nelle sottocartelle. Possono essere pubblicati singolarmente perché npm non è mappato direttamente su Git. npm pubblica tutto ciò che è nella tua directory.
John Chadwick,

14
Per chiunque si imbatterà in questo in seguito ... A partire da npm5, npm eseguirà qualsiasi preparescript per "installazioni" nude, che include git deps. Ciò significa che i commenti precedenti sulla compilation e sulle cartelle dist non sono aggiornati. Qualsiasi pacchetto che imposta correttamente la propria compilation preparefunzionerà perfettamente come un dep di git senza impegnare alcun asset compilato in git.
Jasonkarns,

54

C'è anche npm install https://github.com/{USER}/{REPO}/tarball/{BRANCH}da usare un ramo diverso.


Ho riscontrato questo problema ... github.com/yarnpkg/yarn/issues/2738 Sono stato in grado di cambiare il registro con il registro tarball di github e ha funzionato .. Grazie!
Matt Goo,

Ciò ha risolto alcuni importanti problemi di prestazioni per me. L'uso di {USER} / {REPO} .git # {BRANCH} è stato molto lento.
Erik Koopmans,

37

L'attuale risposta principale di Peter Lyons non è rilevante con le recenti versioni di NPM. Ad esempio, usare lo stesso comando che è stato criticato in questa risposta ora va bene.

$ npm install https://github.com/visionmedia/express

Se si verificano problemi continui, potrebbe trattarsi di un problema con qualunque pacchetto si stia utilizzando.


Inoltre reindirizza automaticamente a github.com/expressjs/express ora quando si utilizza questo comando :)
Colin D

33

I metodi sono trattati abbastanza bene ora nella documentazione di installazione di npm così come le numerose altre risposte qui.

npm install git+ssh://git@github.com:<githubname>/<githubrepo.git[#<commit-ish>]
npm install git+ssh://git@github.com:<githubname>/<githubrepo.git>[#semver:^x.x]
npm install git+https://git@github.com/<githubname>/<githubrepo.git>
npm install git://github.com/<githubname>/<githubrepo.git>
npm install github:<githubname>/<githubrepo>[#<commit-ish>]

Tuttavia, qualcosa di notevole che è cambiato di recente è npm che aggiunge lo preparescript per sostituire lo prepublishscript. Questo risolve un problema di vecchia data in cui i moduli installati tramite git non eseguivano lo prepublishscript e quindi non completavano i passaggi di compilazione che si verificano quando un modulo viene pubblicato nel registro npm. Vedi https://github.com/npm/npm/issues/3055 .

Ovviamente, gli autori del modulo dovranno aggiornare il loro package.json per utilizzare la nuova preparedirettiva affinché questo possa iniziare a funzionare.


19

AGGIORNA ora puoi fare: npm install git://github.com/foo/bar.git
o in package.json:

"dependencies": {
  "bar": "git://github.com/foo/bar.git"
}

19

La forma generale della sintassi è

<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish> | #semver:<semver>]

il che significa che sarà per il tuo caso

npm install git+ssh://git@github.com/visionmedia/express.git

Dai documenti di npmjs:

npm installa:

Installa il pacchetto dal provider git ospitato, clonandolo con git. Per un URL remoto git completo, verrà tentato solo quell'URL.

<protocol>://[<user>[:<password>]@]<hostname>[:<port>][:][/]<path>[#<commit-ish>

| #semver:] è uno dei file git, git + ssh, git + http, git + https o git +.

Se viene fornito #, verrà utilizzato per clonare esattamente quel commit. Se commit-ish ha il formato #semver :, può essere qualsiasi intervallo semver valido o versione esatta, e npm cercherà qualsiasi tag o riferimento corrispondente a tale intervallo nel repository remoto, proprio come farebbe per una dipendenza dal registro. Se né # né

semver: viene specificato, quindi viene utilizzato il master.

Se il repository utilizza i sottomoduli, anche quei sottomoduli verranno clonati.

Se il pacchetto da installare contiene uno script di preparazione, verranno installate le sue dipendenze e devDependencies e verrà eseguito lo script di preparazione, prima che il pacchetto venga pacchetto e installato.

Le seguenti variabili di ambiente git sono riconosciute da npm e verranno 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 i dettagli.

Esempi:

npm install git+ssh://git@github.com:npm/npm.git#v1.0.27
npm install git+ssh://git@github.com:npm/npm#semver:^5.0
npm install git+https://isaacs@github.com/npm/npm.git
npm install git://github.com/npm/npm.git#v1.0.27
GIT_SSH_COMMAND='ssh -i ~/.ssh/custom_ident' npm install git+ssh://git@github.com:npm/npm.git npm install

14

Installalo direttamente:

npm install visionmedia/express

In alternativa, puoi aggiungere "express": "github:visionmedia/express"alla "dependencies"sezione del package.jsonfile, quindi eseguire:

npm install

9

Potresti anche fare

npm i alex-cory/fasthacks

o

npm i github:alex-cory/fasthacks

Fondamentalmente:

npm i user_or_org/repo_name

6

È possibile installare direttamente un repository github con il npm installcomando, in questo modo: npm install https://github.com/futurechallenger/npm_git_install.git --save

NOTA: nel repository che verrà installato dal comando npm:

  1. forse devi avere una cartella dist nel tuo repository, secondo il commento di @Dan Dascalescu.
  2. Devi assolutamente avere un package.json nel tuo repository! che dimentico di aggiungere.

1
Non è necessaria una distcartella o alcun codice di build nel repository. Devi solo usare uno preparescript in package.json.
Cameron Tacklind,

4

Semplice:

npm install *GithubUrl*.git --save

esempio :

npm install https://github.com/visionmedia/express.git --save

0

Ci ho provato npm install git+https://github.com/visionmedia/expressma ci è voluto troppo tempo e non ero sicuro che avrebbe funzionato.

Ciò che ha funzionato per me è stato - yarn add git+https://github.com/visionmedia/express.


-3

Prova questo comando

 npm install github:[Organisation]/[Repository]#[master/BranchName] -g

questo comando ha funzionato per me.

 npm install github:BlessCSS/bless#3.x -g

12
NON USARE SUDO CON NPM INSTALL! piuttosto usa chown per cambiare proprietario.
Marek Fajkus,

La versione è il nome tag / ramo o la versione package.json?
mfrachet,

@MarekFajkus se installi su Linux tramite un gestore di pacchetti usando sudo ... dovrai usare root se vuoi installare i pacchetti a livello globale
Ray Foss

1
@RayFoss Un anno di ritardo ma ... questo è solo se si desidera che il pacchetto installato a livello globale sia disponibile per tutti gli utenti, cosa che di rado è il caso. Configura npm per installare i pacchetti globali ~/node_modules, quindi non avrai mai bisogno di sudo.
Mr5o1,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.