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.