Jak zainstalować pakiet npm bezpośrednio z GitHub?


870

Próba instalacji modułów z github powoduje:

Błąd ENOENT w pliku package.json.

Łatwo reprodukowane za pomocą ekspresu:

npm install https://github.com/visionmedia/express zgłasza błąd.

npm install express Pracuje.

Dlaczego nie mogę zainstalować z github?

Oto dane wyjściowe konsoli:

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
Czy ktoś może podać format devDependencies pliku package.json?
Adam

1
@Adam możesz dodać "express": "github:visionmedia/express"do "dependencies"sekcji package.json file, a następnie uruchomić: npm install(jak wspomniano poniżej)
Danny

@ Danny, to nie działa dla mnie. Zastanawiam się, czy w tym ekspresowym repozytorium był folder dist, aby go włączyć.
ml242

Odpowiedzi:


1158

Ponieważ https://github.com/visionmedia/expressjest to adres URL strony internetowej, a nie moduł npm. Użyj tego smaku:

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

lub ten smak, jeśli potrzebujesz SSH:

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

86
Możesz także użyć, git+https://github.com/visionmedia/express.gitaby użyć https zamiast ssh.
Steve Willcock

43
Zauważ, że repozytorium chcesz zainstalować musi być moduł npm , musi zawierać package.jsonplik albo dostaniesz ten błąd: Error: ENOENT, open 'tmp.tgz-unpack/package.json'.
GabLeRoux

20
co jeśli chcę konkretną gałąź
kilianc

3
Jedynym rozwiązaniem, o którym teraz myślę, jest określenie zatwierdzenia za pomocą ... / express.git # commit
Gaston Sanchez

39
Warto powiedzieć, że być może trzeba będzie uciec, #aby użyć określonej gałęzi z powłoki, tj .:npm install git+https://github.com/user/repo.git\#branch
mor

655

Możesz także zrobić npm install visionmedia/expressinstalację z Github

lub

npm install visionmedia/express#branch

Istnieje również obsługa instalacji bezpośrednio z Gist, Bitbucket, Gitlab i wielu innych specjalistycznych formatów. Spójrz na npm install dokumentację dla nich wszystkich.


19
Co bez podania adresu URL? Skąd npm wie, jakiej usługi hostingowej smaków używasz?
Jake Rayson,

22
@Jake Rayson: jest to możliwe od wersji 1.1.65 i działa github.comtylko dla .
ezze

5
Nie działało dla mnie w systemie Windows - po prostu próbowałem zainstalować z podfolderu mojego bieżącego katalogu.
Jarrod Mosen

7
Uwaga: nie działa to w przypadku instalacji globalnych (tj. Npm i repo / pkg -g) od npm 1.4.28
użytkownik3751385

1
@ user3751385 Wydaje się, że globalne instalacje działają w npm 3.3.8.
XåpplI'-I0llwlg'I -

170

Jeśli git nie jest zainstalowany, możemy spróbować

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

10
Świetna odpowiedź! Działa to dla mnie, podczas gdy inne polecenia (z innych odpowiedzi) utknęły w logice pobierania git.
Daniel Kmak

2
Możesz także użyć nazw znaczników zamiast master. Prawdopodobnie bezpieczniej to zrobić w ten sposób.
mpen

4
Miły dla podczas pracy z gałęziami, należy zmodyfikować odpowiedź zawierać ogólny format odpowiedzi, ja nie zauważyłem /tarball/na początku
Lu Roman

2
To jedyna odpowiedź, która zadziałała dla mnie podczas instalowania zależności z poziomu kontenera Docker.
Fela Maslen,

1
Jest to również idealne rozwiązanie, ponieważ nie wymaga pobierania całego repozytorium. Dzięki!
som

58

Aktualizacja z września 2016 r

Instalacja z waniliowych adresów URL https github działa teraz:

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

EDYCJA 1: kilku użytkowników komentuje, że nie możesz tego zrobić dla wszystkich modułów, ponieważ czytasz z systemu kontroli źródła, który może również zawierać nieprawidłowy / nieskompilowany / błędny kod. Tak więc dla jasności (chociaż powinno to być oczywiste): biorąc pod uwagę, że kod w repozytorium jest w stanie użytecznym npm , możesz teraz całkiem szczęśliwie zainstalować bezpośrednio z github

EDYCJA 2: (21-10-2019) Obecnie przeżywamy „szczyt Typescript / React / Babel”, dlatego kompilacja JavaScript stała się dość powszechna. Jeśli potrzebujesz wziąć pod uwagę kompilację, zajrzyj do prepare. To powiedziawszy, moduły NPM nie muszą być kompilowane i mądrze jest założyć, że kompilacja nie jest domyślna, szczególnie dla starszych modułów węzłów (i być może również dla bardzo nowych, najnowocześniejszych „ESNext” -y).


9
Nie możesz zainstalować żadnego pakietu npm z jego źródła GitHub, chyba że repo zawiera distfolder, a większość nie. Problem, z którym się powiązałem, to błąd npm - prebuildkrok ten nie jest uruchamiany podczas instalacji z GitHub. Jako przykład spróbuj zainstalować node-influx / node-influx .
Dan Dascalescu

4
Repozytoria bez distfolderów MOŻNA zainstalować z GitHub, na przykład: npm install https://github.com/fergiemcdowall/search-index-adderdziała idealnie.
Fergie,

4
Racja, ponieważ masz bezpośrednio źródło usabel /lib(tak jakbyś miał folder dist). Chodzi mi o to, że samo włączenie adresu URL GitHub do repozytorium w pliku package.jons nie gwarantuje, że będzie działało podczas instalowania tego repozytorium. Na przykład moduły napisane w TypeScript muszą wepchnąć swój przetłumaczony kod do repozytorium. Zazwyczaj tego nie robią, ale raczej używają skryptu prepublish do zrzucenia kodu .JS do folderu dist, który jest przesyłany do npmjs.com.
Dan Dascalescu,

2
Wiem, że to trochę za późno, ale sztuczka polega na tym, że npm nie ma mapowania 1 na 1 do repozytoriów Git. Niektóre projekty budują swoje pliki źródłowe przed opublikowaniem, a nie przed zatwierdzeniem, co oznacza, że ​​NIE są one w repozytorium Git, ale byłyby w pakiecie npm - projekty, które to robią, nie będą działać bezpośrednio z Git. Innym przykładem tego, jak może się to nie powieść, są repozytoria makr - na przykład projekt GitHub Babela zawiera w podfolderach setki indywidualnych pakietów npm. Można je publikować indywidualnie, ponieważ npm nie mapuje bezpośrednio na Git. npm publikuje wszystko, co jest w twoim katalogu.
John Chadwick,

13
Dla każdego, kto natknie się na to później ... Na przykład npm5, npm uruchomi dowolny prepareskrypt dla samych „instalacji”, w tym git deps. Co oznacza, że ​​powyższe komentarze dotyczące kompilacji i folderów dist są nieaktualne. Każdy pakiet, który poprawnie ustawia swoją kompilację do uruchomienia, preparebędzie działał dobrze jako git dep bez wprowadzania żadnych skompilowanych zasobów do git.
jasonkarns,


37

Obecna najwyższa odpowiedź Petera Lyonsa nie ma znaczenia w najnowszych wersjach NPM. Na przykład użycie tego samego polecenia, które było krytykowane w tej odpowiedzi, jest teraz w porządku.

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

Jeśli nadal występują problemy, może to być problem z dowolnym pakietem, którego używasz.


Przekierowuje również automatycznie do github.com/expressjs/express teraz, gdy użyjesz tego polecenia :)
Colin D

33

Metody są teraz dość dobrze omówione w dokumentacji instalacyjnej npm, a także w wielu innych odpowiedziach tutaj.

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>]

Jednak coś, co ostatnio się zmieniło, to npm dodanie prepareskryptu w celu zastąpienia prepublishskryptu. Rozwiązuje to długotrwały problem polegający na tym, że moduły zainstalowane przez git nie uruchomiły prepublishskryptu, a tym samym nie zakończyły kroków kompilacji, które występują, gdy moduł jest publikowany w rejestrze npm. Zobacz https://github.com/npm/npm/issues/3055 .

Oczywiście autorzy modułu będą musieli zaktualizować pakiet package.json, aby użyć nowej preparedyrektywy, aby to zaczęło działać.


19

AKTUALIZACJA teraz możesz zrobić: npm install git://github.com/foo/bar.git
lub w package.json:

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

19

Ogólna postać składni to

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

co oznacza, że ​​tak będzie w twoim przypadku

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

Z dokumentów npmjs:

instalacja npm:

Instaluje pakiet od hostowanego dostawcy git, klonując go za pomocą git. W przypadku pełnego zdalnego adresu URL git zostanie podjęta próba tylko tego adresu URL.

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

| #semver:] to jeden z plików git, git + ssh, git + http, git + https lub git +.

Jeśli podano #, zostanie ono użyte do sklonowania dokładnie tego zatwierdzenia. Jeśli zatwierdzenie ma format #semver :, może to być dowolny prawidłowy zakres semver lub dokładna wersja, a npm będzie szukał jakichkolwiek znaczników lub referencji pasujących do tego zakresu w zdalnym repozytorium, podobnie jak w przypadku zależności rejestru. Jeśli ani # lub

semver: jest określony, następnie używany jest master.

Jeśli repozytorium korzysta z podmodułów, te podmoduły również zostaną sklonowane.

Jeśli instalowany pakiet zawiera skrypt przygotowawczy, jego zależności i devDependencies zostaną zainstalowane, a skrypt przygotowawczy zostanie uruchomiony, zanim pakiet zostanie spakowany i zainstalowany.

Następujące zmienne środowiskowe git są rozpoznawane przez npm i zostaną dodane do środowiska podczas uruchamiania git:

  • GIT_ASKPASS
  • GIT_EXEC_PATH
  • GIT_PROXY_COMMAND
  • GIT_SSH
  • GIT_SSH_COMMAND
  • GIT_SSL_CAINFO GIT_SSL_NO_VERIFY

Szczegółowe informacje można znaleźć na stronie man git.

Przykłady:

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

Zainstaluj bezpośrednio:

npm install visionmedia/express

Możesz też dodać "express": "github:visionmedia/express"do "dependencies"sekcji package.jsonpliku, a następnie uruchomić:

npm install

9

Ty też możesz to zrobić

npm i alex-cory/fasthacks

lub

npm i github:alex-cory/fasthacks

Gruntownie:

npm i user_or_org/repo_name

6

Możesz bezpośrednio zainstalować repozytorium github, wydając npm installpolecenie: npm install https://github.com/futurechallenger/npm_git_install.git --save

UWAGA: W repozytorium, które zostanie zainstalowane za pomocą polecenia npm:

  1. może musisz mieć dyst folder w repo, zgodnie z komentarzem @Dan Dascalescu.
  2. Zdecydowanie musisz mieć w pakiecie pakiet.json! które zapomniałem dodać.

1
W distrepozytorium nie potrzebujesz folderu ani żadnego kodu kompilacji. Musisz tylko użyć prepareskryptu w package.json.
Cameron Tacklind

4

Prosty :

npm install *GithubUrl*.git --save

przykład:

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

0

próbowałem npm install git+https://github.com/visionmedia/express ale trwało to zbyt długo i nie byłem pewien, czy to zadziała.

Dla mnie zadziałało - yarn add git+https://github.com/visionmedia/express.


-3

Wypróbuj to polecenie

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

to polecenie działało dla mnie.

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

12
NIE UŻYWAJ SUDO Z INSTALACJĄ NPM! raczej użyj chown, aby zmienić właściciela.
Marek Fajkus,

Wersja to nazwa znacznika / gałęzi lub wersja package.json?
mfrachet

@MarekFajkus, jeśli instalujesz w systemie Linux za pomocą menedżera pakietów używającego sudo ... musisz użyć roota, jeśli chcesz instalować pakiety globalnie
Ray Foss

1
@RayFoss Rok spóźniony, ale ... tylko wtedy, gdy chcesz, aby globalnie zainstalowany pakiet był dostępny dla wszystkich użytkowników, co rzadko się zdarza. Wystarczy skonfigurować npm, aby zainstalować pakiety globalne ~/node_modules, a wtedy nigdy nie potrzebujesz sudo.
Mr5o1,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.