Bagaimana cara menginstal paket npm dari GitHub secara langsung?

870

Mencoba memasang modul dari github menghasilkan:

ENOENT error pada package.json.

Mudah direproduksi menggunakan express:

npm install https://github.com/visionmedia/express melempar kesalahan.

npm install express bekerja.

Mengapa saya tidak dapat menginstal dari github?

Ini output konsolnya:

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
orang mograbi
sumber
1
Adakah yang bisa memberikan format package.json devDependencies?
Adam
1
@ Adam Anda dapat menambahkan "express": "github:visionmedia/express"ke "dependencies"bagian package.json file, lalu jalankan: npm install(seperti yang disebutkan di bawah ini)
Danny
@danny, itu tidak berhasil untuk saya. Saya bertanya-tanya apakah ada folder dist dalam repo ekspres untuk mengaktifkannya.
ml242

Jawaban:

1159

Karena https://github.com/visionmedia/expressadalah URL halaman web dan bukan modul npm. Gunakan rasa ini:

git+https://[email protected]/visionmedia/express.git

atau rasa ini jika Anda membutuhkan SSH:

git+ssh://[email protected]/visionmedia/express.git
Peter Lyons
sumber
86
Anda juga dapat menggunakan git+https://github.com/visionmedia/express.gituntuk menggunakan https daripada ssh.
Steve Willcock
43
Perhatikan bahwa repositori Anda ingin menginstal harus menjadi modul NPM , itu harus berisi package.jsonfile atau yang lain Anda akan mendapatkan error ini: Error: ENOENT, open 'tmp.tgz-unpack/package.json'.
GabLeRoux
20
bagaimana jika saya ingin cabang tertentu
kilianc
3
Satu-satunya solusi yang saya pikirkan untuk saat ini adalah menentukan komit dengan ... / express.git # commit
Gaston Sanchez
39
Layak dikatakan bahwa Anda mungkin perlu melarikan diri #untuk menggunakan cabang tertentu dari shell, yaitu:npm install git+https://github.com/user/repo.git\#branch
mor
656

Anda juga npm install visionmedia/expressdapat menginstal dari Github

atau

npm install visionmedia/express#branch

Ada juga dukungan untuk menginstal langsung dari Gist, Bitbucket, Gitlab, dan sejumlah format khusus lainnya. Lihatlah npm install dokumentasi untuk semuanya.

pengguna2487135
sumber
19
Apa, tanpa menentukan URL? Bagaimana npm tahu layanan hosting rasa mana yang Anda gunakan?
Jake Rayson
22
@ Jake Rayson: itu mungkin karena versi 1.1.65 dan github.comhanya berfungsi untuk .
mis.
5
Tidak berfungsi untuk saya di Windows - hanya mencoba menginstal dari subfolder dari direktori saya saat ini.
Jarrod Mosen
7
Catatan ini tidak berfungsi pada instalasi global (mis. Npm i repo / pkg -g) pada npm 1.4.28
user3751385
1
@ user3751385 Instalasi global tampaknya berfungsi di npm 3.3.8.
XåpplI'-I0llwlg'I -
170

Jika git tidak diinstal, kita dapat mencoba

npm install --save https://github.com/Amitesh/gulp-rev-all/tarball/master
Amitesh
sumber
10
Jawaban bagus! Itu bekerja untuk saya sementara perintah lain (dari jawaban lain) terjebak pada beberapa logika git fetching.
Daniel Kmak
2
Anda juga dapat menggunakan nama tag sebagai ganti master. Mungkin lebih aman melakukannya dengan cara itu.
buka
4
Bagus untuk ketika Anda bekerja dengan cabang, Anda harus memodifikasi jawaban Anda untuk menyertakan jawaban format umum, saya tidak melihat /tarball/pada awalnya
Lu Roman
2
Ini adalah satu-satunya jawaban yang berfungsi untuk saya ketika menginstal dependensi dari dalam wadah Docker.
Fela Maslen
1
Ini juga sempurna untuk tidak mengharuskan seluruh repo diunduh. Terima kasih!
som
59

Pembaruan September 2016

Menginstal dari vanilla https github URL sekarang berfungsi:

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

EDIT 1: ada beberapa pengguna yang berkomentar bahwa Anda tidak dapat melakukan ini untuk semua modul karena Anda membaca dari sistem kontrol sumber, yang mungkin mengandung kode tidak valid / tidak dikompilasi / kereta. Jadi untuk menjadi jelas (walaupun harus dikatakan): mengingat bahwa kode dalam repo dalam keadaan npm-usable , Anda sekarang dapat dengan senang hati menginstal langsung dari github

EDIT 2: (21-10-2019) Kita sekarang hidup melalui "peak Typescript / React / Babel", dan oleh karena itu kompilasi JavaScript menjadi sangat umum. Jika Anda perlu mempertimbangkan kompilasi, lihat prepare. Yang mengatakan, modul NPM tidak perlu dikompilasi , dan bijaksana untuk mengasumsikan bahwa kompilasi bukan default, terutama untuk modul node yang lebih lama (dan mungkin juga untuk yang baru, "ESNext" -y yang sangat baru).

Fergie
sumber
9
Anda tidak dapat menginstal paket npm yang Anda inginkan dari sumber GitHub-nya, kecuali repo menyertakan distfolder, dan sebagian besar tidak. Masalah yang saya tautkan adalah bug npm - prebuildlangkah ini tidak berjalan saat menginstal dari GitHub. Sebagai contoh, cobalah menginstal node-influx / node-influx .
Dan Dascalescu
4
Repos tanpa distfolder BISA diinstal dari GitHub, misalnya: npm install https://github.com/fergiemcdowall/search-index-adderberfungsi dengan sempurna.
Fergie
4
Benar, karena Anda memiliki sumber usabel langsung di /lib(seolah-olah Anda memiliki folder dist). Maksud saya adalah bahwa hanya memasukkan URL GitHub dari repo di package.jons tidak dijamin berfungsi untuk menginstal repo itu. Modul-modul yang ditulis dalam TypeScript, misalnya, perlu memasukkan kode yang diubah ke dalam repo. Mereka biasanya tidak melakukan ini, melainkan menggunakan skrip pra-publikasi untuk membuang kode .JS ke folder dist, yang akan diunggah ke npmjs.com.
Dan Dascalescu
2
Saya tahu ini agak terlambat, tetapi triknya sebenarnya npm tidak memiliki pemetaan 1-ke-1 untuk repositori Git. Beberapa proyek membangun file sumber mereka sebelum mempublikasikan daripada sebelum melakukan, yang berarti mereka BUKAN dalam repo Git, tetapi akan berada dalam paket npm - proyek yang melakukan ini tidak akan berfungsi langsung dari Git. Contoh lain tentang bagaimana ini bisa gagal adalah repositori makro - proyek GitHub Babel, misalnya, memasukkan ratusan paket npm individu dalam subfolder. Mereka dapat dipublikasikan secara individual karena npm tidak memetakan langsung ke Git. npm menerbitkan apa pun yang ada di direktori Anda.
John Chadwick
14
Bagi siapa saja yang menemukan ini nanti ... Pada npm5, npm akan menjalankan prepareskrip apa pun untuk "instalasi" kosong, yang mencakup git deps. Yang berarti komentar di atas tentang kompilasi dan folder dist sudah ketinggalan zaman. Paket apa pun yang mengatur kompilasi mereka untuk dijalankan prepareakan berfungsi dengan baik sebagai git dep tanpa melakukan aset yang dikompilasi ke git.
jasonkarns
54

Ada juga yang npm install https://github.com/{USER}/{REPO}/tarball/{BRANCH}menggunakan cabang berbeda.

Zakelfassi
sumber
Saya mengalami masalah ini ... github.com/yarnpkg/yarn/issues/2738 Saya dapat mengubah registri menjadi registri tarball github dan berhasil .. Terima kasih!
Matt Goo
Ini menyelesaikan beberapa masalah kinerja utama bagi saya. Menggunakan {USER} / {REPO} .git # {BRANCH} sangat lambat.
Erik Koopmans
37

Jawaban teratas saat ini oleh Peter Lyons tidak relevan dengan versi NPM terbaru. Misalnya, menggunakan perintah yang sama yang dikritik dalam jawaban ini sekarang baik-baik saja.

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

Jika Anda terus mengalami masalah, itu mungkin masalah dengan paket apa pun yang Anda gunakan.

Colin D
sumber
Ini juga akan diarahkan ke github.com/expressjs/express secara otomatis sekarang ketika Anda menggunakan perintah ini :)
Colin D
33

Metodenya tercakup dengan cukup baik sekarang dalam dokumentasi instalasi npm dan juga banyak jawaban lainnya di sini.

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

Namun, sesuatu yang penting yang telah berubah baru-baru ini adalah npm menambahkan prepareskrip untuk menggantikan prepublishskrip. Ini memperbaiki masalah yang sudah berlangsung lama di mana modul yang diinstal melalui git tidak menjalankan prepublishskrip dan dengan demikian tidak menyelesaikan langkah-langkah pembangunan yang terjadi ketika modul diterbitkan ke registri npm. Lihat https://github.com/npm/npm/issues/3055 .

Tentu saja, pembuat modul harus memperbarui paket mereka. Json untuk menggunakan preparearahan baru agar ini mulai bekerja.

nextgentech
sumber
19

PEMBARUAN sekarang dapat Anda lakukan: npm install git://github.com/foo/bar.git
atau di package.json:

"dependencies": {
  "bar": "git://github.com/foo/bar.git"
}
Sagiv Ofek
sumber
19

Bentuk umum dari sintaks adalah

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

yang berarti untuk kasus Anda

npm install git+ssh://[email protected]/visionmedia/express.git

Dari npmjs docs:

npm instal:

Instal paket dari penyedia git yang di-host, kloning dengan git. Untuk url remote git lengkap, hanya URL yang akan dicoba.

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

| #semver:] adalah salah satu file git, git + ssh, git + http, git + https, atau git +.

Jika # disediakan, itu akan digunakan untuk mengkloning komit tersebut. Jika komit-ish memiliki format #semver :, bisa berupa rentang semver yang valid atau versi yang tepat, dan npm akan mencari tag atau referensi yang cocok dengan rentang dalam repositori jarak jauh, seperti halnya untuk ketergantungan pada registri. Jika tidak # atau

semver: ditentukan, lalu master digunakan.

Jika repositori menggunakan submodula, submodula tersebut juga akan dikloning.

Jika paket yang diinstal berisi skrip persiapan, dependensi dan dependensinya akan diinstal, dan skrip persiapan akan dijalankan, sebelum paket dikemas dan diinstal.

Variabel lingkungan git berikut dikenali oleh npm dan akan ditambahkan ke lingkungan saat menjalankan git:

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

Lihat halaman git man untuk detailnya.

Contoh:

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
sumber
14

Instal secara langsung:

npm install visionmedia/express

Atau, Anda dapat menambahkan "express": "github:visionmedia/express"ke "dependencies"bagian package.jsonfile, lalu jalankan:

npm install
Tyler Long
sumber
9

Anda juga bisa melakukannya

npm i alex-cory/fasthacks

atau

npm i github:alex-cory/fasthacks

Pada dasarnya:

npm i user_or_org/repo_name
Alex Cory
sumber
6

Anda dapat langsung menginstal repo github dengan npm installperintah, seperti ini: npm install https://github.com/futurechallenger/npm_git_install.git --save

CATATAN: Dalam repo yang akan diinstal oleh perintah npm:

  1. mungkin Anda harus memiliki folder dist di repo Anda, menurut komentar @Dan Dascalescu.
  2. Anda pasti harus memiliki package.json dalam repo Anda! yang saya lupa tambahkan.
Bruce Lee
sumber
1
Anda tidak memerlukan distfolder atau kode build apa pun di repo Anda. Anda hanya perlu menggunakan prepareskrip di package.json.
Cameron Tacklind
4

Sederhana:

npm install *GithubUrl*.git --save

contoh:

npm install https://github.com/visionmedia/express.git --save
Khurshid Ansari
sumber
0

Saya mencoba npm install git+https://github.com/visionmedia/expresstetapi itu terlalu lama dan saya tidak yakin itu akan berhasil.

Apa yang berhasil bagi saya adalah - yarn add git+https://github.com/visionmedia/express.

Angin barat
sumber
-3

Coba perintah ini

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

perintah ini bekerja untuk saya.

 npm install github:BlessCSS/bless#3.x -g
Rahil Lakhani
sumber
12
JANGAN GUNAKAN SUDO DENGAN NPM INSTALL! lebih suka menggunakan chown untuk mengganti pemilik.
Marek Fajkus
Versi ini adalah nama tag / cabang atau versi package.json?
mfrachet
@MarekFajkus jika Anda menginstal di Linux melalui manajer paket menggunakan sudo ... Anda harus menggunakan root jika Anda ingin menginstal paket secara global
Ray Foss
1
@RayFoss Setahun terlambat tetapi ... itu hanya jika Anda ingin paket yang terinstal secara global tersedia untuk semua pengguna, yang jarang terjadi. Cukup konfigurasikan npm untuk menginstal paket global ~/node_modules, maka Anda tidak perlu sudo.
Mr5o1