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!     <[email protected]>

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
facet mograbi
źródło
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://[email protected]/visionmedia/express.git

lub ten smak, jeśli potrzebujesz SSH:

git+ssh://[email protected]/visionmedia/express.git
Peter Lyons
źródło
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.

użytkownik2487135
źródło
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
Amitesh
źródło
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).

Fergie
źródło
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,
54

Można też npm install https://github.com/{USER}/{REPO}/tarball/{BRANCH}użyć innej gałęzi.

zakelfassi
źródło
Natknąłem się na ten problem ... github.com/yarnpkg/yarn/issues/2738 Byłem w stanie zmienić rejestr na rejestr tarball github i zadziałało .. Dzięki!
Matt Goo
Rozwiązało to niektóre główne problemy z wydajnością. Korzystanie z {USER} / {REPO} .git # {BRANCH} było bardzo wolne.
Erik Koopmans
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.

Colin D.
źródło
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://[email protected]:<githubname>/<githubrepo.git[#<commit-ish>]
npm install git+ssh://[email protected]:<githubname>/<githubrepo.git>[#semver:^x.x]
npm install git+https://[email protected]/<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ć.

nextgentech
źródło
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"
}
Sagiv Ofek
źródło
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://[email protected]/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://[email protected]:npm/npm.git#v1.0.27
npm install git+ssh://[email protected]:npm/npm#semver:^5.0
npm install git+https://[email protected]/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://[email protected]:npm/npm.git npm install
ishandutta2007
źródło
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
Tyler Long
źródło
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
Alex Cory
źródło
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ć.
Bruce Lee
źródło
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
Khurshid Ansari
źródło
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.

Zefir
źródło
-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
Rahil Lakhani
źródło
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,