Làm cách nào để cài đặt gói npm trực tiếp từ GitHub?


870

Cố gắng cài đặt các mô-đun từ github dẫn đến:

Lỗi ENOENT trên gói.json.

Dễ dàng sao chép bằng express:

npm install https://github.com/visionmedia/express ném lỗi.

npm install express làm.

Tại sao tôi không thể cài đặt từ github?

Đây là đầu ra giao diện điều khiển:

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
Bất cứ ai cũng có thể cung cấp định dạng devDependencies của pack.json?
Adam

1
@Adam bạn có thể thêm "express": "github:visionmedia/express"vào "dependencies"phần của package.json file, sau đó chạy: npm install(như được đề cập dưới đây)
Danny

@danny, điều đó không làm việc cho tôi. Tôi tự hỏi nếu có một thư mục dist trong repo express để kích hoạt nó.
ml242

Câu trả lời:


1158

Bởi vì https://github.com/visionmedia/expresslà URL của một trang web chứ không phải mô-đun npm. Sử dụng hương vị này:

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

hoặc hương vị này nếu bạn cần SSH:

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

86
Bạn cũng có thể sử dụng git+https://github.com/visionmedia/express.gitđể sử dụng https thay vì ssh.
Steve Willcock

43
Lưu ý rằng kho lưu trữ bạn muốn cài đặt phải là mô-đun npm , nó phải chứa package.jsontệp nếu không bạn sẽ gặp lỗi này : Error: ENOENT, open 'tmp.tgz-unpack/package.json'.
GabLeRoux

20
nếu tôi muốn có một chi nhánh cụ thể
kilianc

3
Giải pháp duy nhất tôi nghĩ đến bây giờ là chỉ định một cam kết với ... / express.git # commit
Gaston Sanchez

39
Đáng nói là bạn có thể cần phải thoát khỏi #để sử dụng một nhánh cụ thể từ vỏ, tức là:npm install git+https://github.com/user/repo.git\#branch
mor

655

Bạn cũng có thể làm npm install visionmedia/expressđể cài đặt từ Github

hoặc là

npm install visionmedia/express#branch

Ngoài ra còn có hỗ trợ cài đặt trực tiếp từ Gist, Bitbucket, Gitlab và một số định dạng chuyên dụng khác. Nhìn vào npm install tài liệu cho tất cả chúng.


19
Điều gì, mà không chỉ định URL? Làm thế nào để npm biết dịch vụ lưu trữ hương vị nào bạn đang sử dụng?
Jake Rayson

22
@Jake Rayson: có thể kể từ phiên bản 1.1,65 và chỉ hoạt động github.com.
ezze

5
Không hoạt động với tôi trên Windows - nó chỉ cố cài đặt từ thư mục con của thư mục hiện tại của tôi.
Jarrod Mosen

7
Lưu ý điều này không hoạt động trên các cài đặt toàn cầu (ví dụ: npm i repo / pkg -g) kể từ npm 1.4.28
user3751385

1
@ user3751385 Cài đặt toàn cầu dường như đang hoạt động trong npm 3.3.8.
XåpplI'-I0llwlg'I -

170

Nếu git chưa được cài đặt, chúng ta có thể thử

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

10
Câu trả lời chính xác! Nó hoạt động với tôi trong khi các lệnh khác (từ các câu trả lời khác) bị kẹt ở một số logic tìm nạp git.
Daniel Kmak

2
Bạn cũng có thể sử dụng tên thẻ thay cho master. Có lẽ an toàn hơn để làm theo cách đó.
mở

4
Tốt đẹp cho khi bạn đang làm việc với các ngành, bạn nên thay đổi câu trả lời của bạn để bao gồm một câu trả lời định dạng chung, tôi đã không nhận ra /tarball/lúc đầu
Lu La Mã

2
Đây là câu trả lời duy nhất phù hợp với tôi khi cài đặt một phụ thuộc từ trong bộ chứa Docker.
Fela Maslen

1
Điều này cũng hoàn hảo cho việc không yêu cầu tải xuống toàn bộ repo. Cảm ơn!
som

59

Cập nhật tháng 9 năm 2016

Cài đặt từ URL github vanilla https hiện hoạt động:

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

EDIT 1: có một vài người dùng nhận xét rằng bạn không thể làm điều này cho tất cả các mô-đun vì bạn đang đọc từ hệ thống kiểm soát nguồn, có thể chứa mã không hợp lệ / không được biên dịch / lỗi. Vì vậy, để rõ ràng (mặc dù không cần phải nói): với điều kiện là mã trong repo ở trạng thái có thể sử dụng được , bạn có thể cài đặt trực tiếp từ github

EDIT 2: (21-10-2019) Chúng ta hiện đang sống qua "Bản mô tả / Phản ứng / Babel đỉnh cao", và do đó việc biên dịch JavaScript đã trở nên khá phổ biến. Nếu bạn cần phải biên dịch vào tài khoản xem xét prepare. Điều đó nói rằng, các mô-đun NPM không cần phải được biên dịch và thật khôn ngoan khi cho rằng việc biên dịch không phải là mặc định, đặc biệt là đối với các mô-đun nút cũ hơn (và có thể cả đối với các mô-đun "ESNext" rất mới mẻ).


9
Bạn không thể cài đặt bất kỳ gói npm nào bạn muốn từ nguồn GitHub của nó, trừ khi repo bao gồm một distthư mục và hầu hết không. Vấn đề tôi liên kết là lỗi npm - prebuildbước không chạy khi cài đặt từ GitHub. Ví dụ, hãy thử cài đặt nút-Influx / node-Influx .
Dan Dascalescu

4
Repos không có distthư mục CÓ THỂ được cài đặt từ GitHub, ví dụ: npm install https://github.com/fergiemcdowall/search-index-adderhoạt động hoàn hảo.
Fergie

4
Đúng, bởi vì bạn có nguồn sử dụng trực tiếp trong /lib(như thể bạn có một thư mục dist). Quan điểm của tôi là chỉ bao gồm URL GitHub của một repo trong pack.jons không được đảm bảo để hoạt động để cài đặt repo đó. Các mô-đun được viết bằng TypeScript, ví dụ, cần đẩy mã được mã hóa của chúng vào repo. Họ thường không làm điều này mà thay vào đó sử dụng tập lệnh phát hành trước để chuyển mã .JS vào một thư mục dist, được tải lên npmjs.com.
Dan Dascalescu

2
Tôi biết điều này hơi muộn, nhưng mẹo thực sự là npm không có ánh xạ 1-1 đến kho Git. Một số dự án xây dựng tệp nguồn của họ trước khi xuất bản thay vì trước khi cam kết, có nghĩa là chúng KHÔNG có trong repo Git, nhưng sẽ nằm trong gói npm - các dự án thực hiện điều này sẽ không hoạt động ngay từ Git. Một ví dụ khác về cách điều này có thể thất bại là các kho lưu trữ vĩ mô - ví dụ, dự án GitHub của Babel, bao gồm hàng trăm gói npm riêng lẻ trong các thư mục con. Chúng có thể được xuất bản riêng lẻ vì npm không ánh xạ trực tiếp đến Git. npm xuất bản bất cứ điều gì trong thư mục của bạn.
John Chadwick

14
Đối với bất kỳ ai tình cờ phát hiện ra điều này sau ... Kể từ npm5, npm sẽ chạy bất kỳ preparetập lệnh nào cho "cài đặt" trần, bao gồm git deps. Điều đó có nghĩa là các ý kiến ​​trên xung quanh các thư mục biên dịch và dist đã lỗi thời. Bất kỳ gói nào thiết lập đúng trình biên dịch của chúng để chạy preparesẽ hoạt động tốt như một git dep mà không đưa bất kỳ tài sản được biên dịch nào vào git.
jasonkarns

54

Cũng có npm install https://github.com/{USER}/{REPO}/tarball/{BRANCH}để sử dụng một chi nhánh khác.


Tôi gặp phải vấn đề này ... github.com/yarnpkg/yarn/issues/2738 Tôi đã có thể thay đổi sổ đăng ký thành sổ đăng ký tarball github và nó đã hoạt động .. Cảm ơn!
Matt Goo

Điều này giải quyết một số vấn đề hiệu suất lớn cho tôi. Sử dụng {USER} / {REPO} .git # {BRANCH} rất chậm.
Erik Koopmans

37

Câu trả lời hàng đầu hiện tại của Peter Lyons không liên quan đến các phiên bản NPM gần đây. Ví dụ, sử dụng cùng một lệnh đã bị chỉ trích trong câu trả lời này hiện đã ổn.

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

Nếu bạn tiếp tục gặp sự cố, đó có thể là sự cố với bất kỳ gói nào bạn đang sử dụng.


Nó cũng tự động chuyển hướng đến github.com/expressjs/express ngay bây giờ khi bạn sử dụng lệnh này :)
Colin D

33

Các phương thức được trình bày khá tốt hiện nay trong tài liệu cài đặt của npm cũng như nhiều câu trả lời khác ở đây.

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

Tuy nhiên, một điều đáng chú ý đã thay đổi gần đây là npm thêm preparetập lệnh để thay thế prepublishtập lệnh. Điều này khắc phục sự cố lâu dài trong đó các mô-đun được cài đặt qua git không chạy prepublishtập lệnh và do đó không hoàn thành các bước xây dựng xảy ra khi mô-đun được xuất bản lên sổ đăng ký npm. Xem https://github.com/npm/npm/issues/3055 .

Tất nhiên, các tác giả mô-đun sẽ cần cập nhật gói.json của họ để sử dụng preparechỉ thị mới cho điều này để bắt đầu làm việc.


19

CẬP NHẬT bây giờ bạn có thể làm: npm install git://github.com/foo/bar.git
hoặc trong package.json:

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

19

Dạng chung của cú pháp là

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

có nghĩa là cho trường hợp của bạn

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

Từ tài liệu của npmjs:

cài đặt npm:

Cài đặt gói từ nhà cung cấp git được lưu trữ, nhân bản nó với git. Đối với một url từ xa git đầy đủ, chỉ URL đó sẽ được thử.

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

| #semver:] là một trong các tệp git, git + ssh, git + http, git + https hoặc git +.

Nếu # được cung cấp, nó sẽ được sử dụng để sao chép chính xác cam kết đó. Nếu commit-ish có định dạng #semver:, có thể là bất kỳ phạm vi semver hợp lệ hoặc phiên bản chính xác nào, và npm sẽ tìm bất kỳ thẻ hoặc ref nào phù hợp với phạm vi đó trong kho lưu trữ từ xa, giống như tùy thuộc vào đăng ký. Nếu không # hoặc

semver: được chỉ định, sau đó master được sử dụng.

Nếu kho lưu trữ sử dụng các mô hình con, các mô hình con đó cũng sẽ được nhân bản.

Nếu gói được cài đặt chứa tập lệnh chuẩn bị, các phụ thuộc và devDepencies của nó sẽ được cài đặt và tập lệnh chuẩn bị sẽ được chạy, trước khi gói được đóng gói và cài đặt.

Các biến môi trường git sau được nhận ra bởi npm và sẽ được thêm vào môi trường khi chạy git:

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

Xem trang git man để biết chi tiết.

Ví dụ:

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

Cài đặt trực tiếp:

npm install visionmedia/express

Ngoài ra, bạn có thể thêm "express": "github:visionmedia/express"vào "dependencies"phần của package.jsontệp, sau đó chạy:

npm install

9

Bạn cũng có thể làm

npm i alex-cory/fasthacks

hoặc là

npm i github:alex-cory/fasthacks

Về cơ bản:

npm i user_or_org/repo_name

6

Bạn có thể trực tiếp cài đặt một repo github bằng npm installlệnh, như thế này: npm install https://github.com/futurechallenger/npm_git_install.git --save

LƯU Ý: Trong repo sẽ được cài đặt bằng lệnh npm:

  1. có lẽ bạn cần phải có một quận thư mục trong bạn repo, theo nhận xét của @Dan Dascalescu.
  2. Bạn chắc chắn phải có một gói.json trong bạn repo! mà tôi quên thêm.

1
Bạn không cần một distthư mục hoặc bất kỳ mã xây dựng nào trong repo của bạn. Bạn chỉ cần sử dụng một preparetập lệnh trong package.json.
Cameron Tacklind

4

Đơn giản :

npm install *GithubUrl*.git --save

thí dụ :

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

0

Tôi đã thử npm install git+https://github.com/visionmedia/expressnhưng điều đó diễn ra quá lâu và tôi không chắc nó sẽ hoạt động.

Những gì đã làm việc cho tôi là - yarn add git+https://github.com/visionmedia/express.


-3

Hãy thử lệnh này

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

lệnh này đã làm việc cho tôi.

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

12
KHÔNG SỬ DỤNG SUDO VỚI NPM CÀI ĐẶT! thay vì sử dụng chown để thay đổi chủ sở hữu.
Marek Fajkus

Phiên bản là tên thẻ / chi nhánh hoặc phiên bản pack.json?
mfrachet

@MarekFajkus nếu bạn cài đặt trên Linux thông qua trình quản lý gói bằng sudo ... bạn sẽ phải sử dụng root nếu bạn muốn cài đặt các gói trên toàn cầu
Ray Foss

1
@RayFoss Một năm muộn nhưng ... chỉ khi bạn muốn gói được cài đặt toàn cầu có sẵn cho tất cả người dùng, điều này hiếm khi xảy ra. Chỉ cần cấu hình npm để cài đặt các gói toàn cầu ~/node_modules, sau đó bạn không bao giờ cần sudo.
Mr5o1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.