Как установить пакет 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 devDependencies?
Адам
1
@ Адам вы можете добавить "express": "github:visionmedia/express"в "dependencies"раздел package.json file, а затем запустить: npm install(как упомянуто ниже)
Дэнни
@ Дэнни, это не работает для меня. Интересно, была ли в этом экспресс-репозитории папка dist для ее включения?
ml242

Ответы:

1160

Потому что 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.
Стив Уиллкок,
44
Обратите внимание , что репозиторий , который вы хотите установить должен быть модуль НПМ , он должен содержать package.jsonфайл, иначе вы получите эту ошибку: Error: ENOENT, open 'tmp.tgz-unpack/package.json'.
GabLeRoux
20
Что
делать,
3
Единственное решение, о котором я сейчас думаю, - это указать коммит с ... / express.git # commit
Гастон Санчес
39
Стоит сказать, что вам, возможно, понадобится экранировать, #чтобы использовать определенную ветку из оболочки, а именно:npm install git+https://github.com/user/repo.git\#branch
mor
657

Вы также можете сделать npm install visionmedia/expressустановку с Github

или

npm install visionmedia/express#branch

Существует также поддержка установки непосредственно из Gist, Bitbucket, Gitlab и ряда других специализированных форматов. Посмотрите на npm install документацию для них всех.

user2487135
источник
19
Что, без указания URL? Как npm узнает, какой сервис хостинга вкусов вы используете?
Джейк Рэйсон,
22
@ Джейк Рэйсон: это возможно начиная с версии 1.1.65 и работает github.comтолько для .
ezze
5
У меня не работало в Windows - он просто пытался установить из подпапки моего текущего каталога.
Джаррод Мозен
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
Amitesh
источник
10
Отличный ответ! Это сработало для меня, в то время как другие команды (из других ответов) застряли в какой-то логике git
Даниэль Кмак
2
Вы также можете использовать имена тегов вместо master. Наверное, безопаснее сделать это таким образом.
mpen
4
Приятно, когда вы работаете с ветками, вы должны изменить свой ответ , чтобы включить общий ответ формата, я не заметил /tarball/в первый
Lu Roman
2
Это единственный ответ, который мне помог при установке зависимости из контейнера Docker.
Фела Маслен
1
Это также идеально подходит для того, чтобы не требовать загрузки всего репо. Спасибо!
сома
60

Обновление сентябрь 2016

Установка из ванильных URL-адресов https github теперь работает:

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

РЕДАКТИРОВАТЬ 1: есть несколько пользователей, которые комментируют, что вы не можете сделать это для всех модулей, потому что вы читаете из системы контроля версий, которая может содержать неверный / некомпилированный / ошибочный код. Итак, чтобы быть ясным (хотя это должно быть само собой разумеется): учитывая, что код в репозитории находится в состоянии , пригодном для использования в npm , теперь вы можете довольно счастливо установить прямо с github

РЕДАКТИРОВАТЬ 2: (21-10-2019) Мы сейчас переживаем "пик Typescript / React / Babel", и поэтому компиляция JavaScript стала довольно распространенным явлением. Если вам нужно принять во внимание компиляцию, изучите prepare. Тем не менее, модули NPM не нуждаются в компиляции , и разумно предположить, что компиляция не по умолчанию, особенно для более старых модулей узлов (и, возможно, также для очень новых, передовых "ESNext" -y).

Fergie
источник
9
Вы не можете установить любой пакет npm, который вам нужен, из его источника GitHub, если в репозитории нет distпапки, а большинство этого не делает. Проблема, с которой я prebuildстолкнулся, - ошибка npm - при установке из GitHub этот шаг не выполняется. В качестве примера попробуйте установить node-infl / node-infl .
Дан Даскалеску
4
Репос без distпапок МОЖЕТ быть установлен из GitHub, например: npm install https://github.com/fergiemcdowall/search-index-adderработает отлично.
Ферги
4
Правильно, потому что у вас есть непосредственно источник usabel /lib(как будто у вас есть папка dist). Я хочу сказать, что включение GitHub URL репозитория в package.jons не гарантирует работоспособность установки репо. Например, модули, написанные на TypeScript, должны помещать свой переданный код в репозиторий. Обычно они этого не делают, а используют сценарий предварительной публикации, чтобы выгрузить код .JS в папку dist, которая загружается на npmjs.com.
Дан Даскалеску
2
Я знаю, что это немного поздно, но уловка в том, что npm не имеет сопоставления 1: 1 с репозиториями Git. Некоторые проекты создают свои исходные файлы перед публикацией, а не перед фиксацией, то есть они НЕ находятся в репозитории Git, но будут в пакете npm - проекты, выполняющие это, не будут работать прямо из Git. Другим примером того, как это может не сработать, являются макро-репозитории. Например, проект Babel GitHub включает сотни отдельных пакетов npm в подпапках. Их можно публиковать по отдельности, потому что npm не отображается напрямую в Git. npm публикует все, что находится в вашем каталоге.
Джон Чедвик
14
Для тех, кто сталкивается с этим позже ... Начиная с npm5, npm будет запускать любой prepareсценарий для простых «установок», включая git deps. Это означает, что вышеприведенные комментарии о компиляции и папках dist устарели. Любой пакет, который правильно запускает их компиляцию, prepareбудет работать как git dep без добавления каких-либо скомпилированных ресурсов в git.
jasonkarns
54

Там также npm install https://github.com/{USER}/{REPO}/tarball/{BRANCH}использовать другую ветку.

zakelfassi
источник
Я столкнулся с этой проблемой ... github.com/yarnpkg/yarn/issues/2738 Мне удалось изменить реестр на tar-архив github, и это сработало .. Спасибо!
Мэтт
Это решило некоторые основные проблемы с производительностью для меня. Использование {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скрипта. Это устраняет давнюю проблему, когда модули, установленные через git, не запускали prepublishскрипт и, таким образом, не выполняли этапы сборки, которые происходят, когда модуль публикуется в реестре npm. См. Https://github.com/npm/npm/issues/3055 .

Конечно, авторам модуля нужно будет обновить свой package.json, чтобы использовать новую prepareдирективу, чтобы это начало работать.

nextgentech
источник
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 +.

Если указан #, он будет использован для клонирования именно этого коммита. Если commit-ish имеет формат #semver :, может быть любым допустимым диапазоном semver или точной версией, и npm будет искать любые теги или ссылки, соответствующие этому диапазону в удаленном репозитории, так же, как это было бы для зависимости реестра. Если ни #, ни

semver: указывается, затем используется master.

Если в хранилище используются подмодули, эти подмодули также будут клонированы.

Если устанавливаемый пакет содержит сценарий подготовки, будут установлены его зависимости и devDependencies, а сценарий подготовки будет запущен до того, как пакет будет упакован и установлен.

Следующие переменные среды git распознаются npm и будут добавлены в среду при запуске git:

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

Смотрите страницу руководства git для деталей.

Примеры:

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
ishandutta2007
источник
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-репозиторий npm installкомандой, например так: npm install https://github.com/futurechallenger/npm_git_install.git --save

ПРИМЕЧАНИЕ. В репозитории, который будет установлен командой npm:

  1. возможно, вам нужно иметь папку dist в своем репо, согласно комментарию @Dan Dascalescu.
  2. Вы обязательно должны иметь в своем репозитории package.json ! который я забыл добавить.
Брюс Ли
источник
1
Вам не нужна distпапка или какой-либо код сборки в вашем репо. Вам просто нужно использовать prepareскрипт в package.json.
Кэмерон Таклинд
4

Просто :

npm install *GithubUrl*.git --save

пример :

npm install https://github.com/visionmedia/express.git --save
Хуршид Ансари
источник
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
НЕ ИСПОЛЬЗУЙТЕ SUDO С NPM INSTALL! лучше использовать chown для смены владельца.
Марек Файкус
Версия - это имя тега / ветви или версия package.json?
mfrachet
@MarekFajkus, если вы устанавливаете в Linux через менеджер пакетов с помощью sudo ... вам придется использовать root, если вы хотите устанавливать пакеты глобально
Рэй Фосс,
1
@RayFoss Год спустя, но ... это только если вы хотите, чтобы глобально установленный пакет был доступен для всех пользователей, что редко бывает. Просто настройте npm для установки глобальных пакетов ~/node_modules, тогда вам никогда не понадобится sudo.
Mr5o1