Як встановити пакет 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.