Як встановити пакет npm безпосередньо з GitHub?


870

Спроба встановити модулі з github призводить до:

ENOENT помилка на package.json.

Легко відтворюється за допомогою експрес:

npm install https://github.com/visionmedia/express кидає помилку.

npm install express працює.

Чому я не можу встановити з github?

Ось консольний вихід:

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
Хтось може надати формат package.json devDependitions?
Адам

1
@Адам ви можете додати "express": "github:visionmedia/express"до "dependencies"розділу package.json file, а потім запустити: npm install(як згадувалося нижче)
Danny

@danny, це не працює для мене. мені цікаво, чи не було папки dist у цьому експрес-репо, щоб увімкнути це.
ml242

Відповіді:


1158

Тому що https://github.com/visionmedia/expressце URL-адреса веб-сторінки, а не npm-модуль. Використовуйте цей аромат:

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

або цей аромат, якщо вам потрібен SSH:

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

86
Ви також git+https://github.com/visionmedia/express.gitможете використовувати https, а не ssh.
Стів Віллок

43
Зверніть увагу , що репозиторій , який ви хочете встановити повинен бути модуль НПМ , він повинен містити package.jsonфайл, інакше ви отримаєте цю помилку: Error: ENOENT, open 'tmp.tgz-unpack/package.json'.
GabLeRoux

20
що робити, якщо я хочу конкретну галузь
kilianc

3
Єдине рішення, про яке я думаю зараз, - це вказати комісію з ... / express.git # commit
Gaston Sanchez

39
Варто сказати , що вам , можливо , потрібно бігти , #щоб використовувати певну гілку від оболонки, тобто:npm install git+https://github.com/user/repo.git\#branch
Мор

655

Ви також npm install visionmedia/expressможете встановити з Github

або

npm install visionmedia/express#branch

Також існує підтримка установки безпосередньо з Gist, Bitbucket, Gitlab та ряду інших спеціалізованих форматів. Подивіться на всю npm install документацію для них.


19
Що, не вказуючи URL? Як npm знає, який смаковий сервіс хостингу ви використовуєте?
Джейк Рейсон

22
@Jake Rayson: це можливо з версії 1.1.65 і працює github.comлише для роботи .
ezze

5
Не працювало для мене в Windows - його просто намагалися встановити з підпапки мого поточного каталогу.
Jarrod Mosen

7
Зауважте, це не працює при глобальних встановленнях (тобто npm i repo / pkg -g) станом на npm 1.4.28
user3751385

1
@ user3751385 Глобальні встановлення, здається, працюють у npm 3.3.8.
XåpplI'-I0llwlg'I -

170

Якщо git не встановлений, ми можемо спробувати

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

10
Чудова відповідь! Це працювало для мене, тоді як інші команди (з інших відповідей) застрягли в певній логіці вибору.
Даніель Кмак

2
Ви також можете використовувати імена тегів замість master. Напевно, безпечніше це зробити так.
1616 року

4
Приємно, коли ви працюєте з гілками, ви повинні змінити свою відповідь , щоб включити загальний відповідь формату, я не помітив /tarball/в перший
Lu Roman

2
Це єдина відповідь, яка працювала для мене під час встановлення залежності з контейнера Docker.
Фела Маслен

1
Це також ідеально для того, щоб не вимагати завантаження всього репо. Дякую!
сом

58

Оновлення вересня 2016 року

Встановлення з https github URL-адрес ванілі зараз працює:

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

EDIT 1: кілька користувачів зазначають, що ви не можете зробити це для всіх модулів, оскільки ви читаєте з системи керування джерелами, яка може містити недійсний / некомпільований / помилковий код. Тож, щоб було зрозуміло (хоча це повинно бути зрозуміло): враховуючи, що код у РЕПО знаходиться в стані npm , який можна використовувати, тепер ви можете досить щасливо встановити безпосередньо з github

EDIT 2: (21-10-2019) Зараз ми переживаємо "пік Typescript / React / Babel", і тому компіляція JavaScript стала досить поширеною. Якщо вам потрібно взяти до уваги компіляцію, зверніть увагу prepare. Слід сказати, що модулі NPM не потрібно компілювати , і є розумним припустити, що компіляція не є за замовчуванням, особливо для старих модулів вузлів (і, можливо, також для самих нових, ESNext--і-тих, що криваються в крайній частині).


9
Ви не можете встановити будь-який пакет npm, який ви хочете, з його джерела GitHub, якщо репо не містить distпапку, а більшість не працює. Проблема, з якою я пов’язана, - це помилка npm - prebuildкрок не виконується при встановленні з GitHub. Як приклад, спробуйте встановити node-приток / node-influx .
Дан Даскалеску

4
РЕПО без distпапок МОЖЕ бути встановлено з GitHub, наприклад: npm install https://github.com/fergiemcdowall/search-index-adderпрацює чудово.
Фергі

4
Правильно, тому що у вас є безпосередньо джерело usabel у /lib(як би у вас була папка dist). Моя думка, що лише включення GitHub URL репо в пакет.jons не гарантовано працює для встановлення цього репо. Наприклад, модулі, написані в TypeScript, потребують натискання свого перекладеного коду в репо. Зазвичай вони цього не роблять, а скоріше використовують сценарій попередньої публікації, щоб скинути .JS-код у папку dist, яка завантажується на npmjs.com.
Дан Даскалеску

2
Я знаю, що це трохи пізно, але фокус насправді npm не має зіставлення 1 на 1 в репозиторії Git. Деякі проекти будують свої вихідні файли перед публікацією, а не перед введенням, тобто вони НЕ перебувають у Git repo, але будуть у пакеті npm - проекти, які роблять це, не працюватимуть прямо з Git. Інший приклад того, як це може бути невдалим, є макрорепозитарії - проект GitHub Babel, наприклад, включає сотні окремих пакетів npm у підпапках. Вони можуть публікуватися окремо, оскільки npm не відображається безпосередньо в Git. npm публікує все, що є у вашому каталозі.
Джон Чадвік

13
Для всіх, хто натрапляє на це пізніше ... Станом на npm5, npm запустить будь-який prepareсценарій для голих "встановлень", який включає git deps. Що означає, що вищезазначені коментарі навколо компіляції та розповсюдження папок застаріли. Будь-який пакет, який належним чином встановлює їх компіляцію prepare, працюватиме добре, як git dep, не вкладаючи жодних зібраних активів у git.
jasonkarns

54

Там також npm install https://github.com/{USER}/{REPO}/tarball/{BRANCH}можна використовувати іншу гілку.


Я зіткнувся з цим питанням ... github.com/yarnpkg/yarn/isissue/2738 Мені вдалося змінити реєстр на реєстр github tarball, і воно спрацювало .. Дякую!
Метт Гуо

Це вирішило деякі основні проблеми щодо ефективності для мене. Використання {USER} / {REPO} .git # {BRANCH} пройшло дуже повільно.
Ерік Коопманс

37

Поточна головна відповідь Пітера Ліона не стосується останніх версій NPM. Наприклад, використання тієї самої команди, яку критикували у цій відповіді, зараз добре.

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

Якщо у вас виникають проблеми, це може бути проблема з будь-яким пакетом, який ви використовували.


Він також автоматично переспрямовує на github.com/expressjs/express автоматично, коли ви використовуєте цю команду :)
Colin D

33

Методи досить добре висвітлені в документації по установці npm, а також у численних інших відповідях тут.

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

Однак щось помітне, що нещодавно змінилося, - це додавання npm prepareдля заміни prepublishсценарію npm . Це виправляє давню проблему, коли модулі, встановлені через git, не запускали prepublishскрипт і, таким чином, не виконували етапи збирання, які виникають під час публікації модуля в реєстрі npm. Дивіться https://github.com/npm/npm/isissue/3055 .

Звичайно, авторам модулів потрібно буде оновити пакунок.json, щоб використовувати нову prepareдирективу для цього, щоб почати працювати.


19

ОНОВЛЕННЯ тепер ви можете зробити: npm install git://github.com/foo/bar.git
або в package.json:

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

19

Загальна форма синтаксису така

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

що означає для вашої справи, це буде

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

З документів npmjs:

npm встановити:

Встановлює пакет від розміщеного постачальника git, клонуючи його git. Для повного віддаленого URL-адреси git буде здійснено спробу лише цієї URL-адреси.

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

| #semver:] - це один із файлів git, git + ssh, git + http, git + https або git +.

Якщо # надано, він буде використаний для клонування саме цього коміту. Якщо команда-іш має формат #semver :, може бути будь-який дійсний діапазон semver або точна версія, і npm шукатиме будь-які теги або refs, що відповідають цьому діапазону у віддаленому сховищі, настільки, наскільки це буде залежно від реєстру. Якщо ні # або

semver: вказано, тоді використовується master.

Якщо репозиторій використовує підмодулі, ці підмодулі будуть також клоновані.

Якщо пакет, що встановлюється, містить сценарій підготовки, його залежності та devDependitions будуть встановлені, а сценарій підготовки буде запущений до упаковки та встановлення пакета.

Наступні змінні середовища git розпізнаються npm і будуть додані до середовища під час запуску git:

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

Докладніше див. На сторінці git man.

Приклади:

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

Встановіть його безпосередньо:

npm install visionmedia/express

Крім того, ви можете додати "express": "github:visionmedia/express"до "dependencies"розділу package.jsonфайлу, а потім запустити:

npm install

9

Ви також можете зробити

npm i alex-cory/fasthacks

або

npm i github:alex-cory/fasthacks

В основному:

npm i user_or_org/repo_name

6

Ви можете безпосередньо встановити github repo за допомогою npm installкоманди, наприклад: npm install https://github.com/futurechallenger/npm_git_install.git --save

ПРИМІТКА: У репо, який буде встановлено командою npm:

  1. можливо, вам доведеться мати папку dist у своєму репо, відповідно до коментаря @Dan Dascalescu.
  2. Ви обов'язково повинні мати пакет.json у вас репо! яку я забуваю додати.

1
Вам не потрібна distпапка або будь-який код складання у вашому РЕПО. Вам просто потрібно використовувати prepareсценарій в package.json.
Cameron Tacklind


0

Я намагався, npm install git+https://github.com/visionmedia/expressале це зайняло занадто довго, і я не був впевнений, що це спрацює.

Що для мене працювало - yarn add git+https://github.com/visionmedia/express.


-3

Спробуйте цю команду

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

ця команда працювала на мене.

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

12
НЕ ВИКОРИСТОВУЙТЕ СУДО З НПМ ВСТАНОВИТИ! скоріше скористайтеся chown для зміни власника.
Марек Файкус

Версія - це тег / назва філії чи версія package.json?
mfrachet

@MarekFajkus, якщо ви встановите на Linux через менеджер пакунків за допомогою sudo ... вам доведеться використовувати root, якщо ви хочете встановити пакети в усьому світі
Ray Foss

1
@RayFoss Запізнився на рік, але ... це лише в тому випадку, якщо ви хочете, щоб глобально встановлений пакет був доступний для всіх користувачів, що рідко трапляється. Просто налаштуйте npm для встановлення глобальних пакетів у ~/node_modules, тоді вам ніколи не знадобиться sudo.
Mr5o1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.