Como instalar um pacote npm no GitHub diretamente?

870

Tentar instalar módulos no github resulta em:

Erro ENOENT no package.json.

Reproduzido facilmente usando express:

npm install https://github.com/visionmedia/express gera erro.

npm install express trabalho.

Por que não consigo instalar no github?

Aqui está a saída do console:

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
guy mograbi
fonte
1
Alguém pode dar o formato package.json devDependencies?
Adam
1
@ Adam você pode adicionar "express": "github:visionmedia/express"à "dependencies"seção package.json file, em seguida, executar: npm install(conforme mencionado abaixo)
Danny
@danny, isso não funciona para mim. Gostaria de saber se havia uma pasta dist nesse repositório expresso para habilitá-lo.
precisa saber é

Respostas:

1159

Porque https://github.com/visionmedia/expressé o URL de uma página da web e não um módulo npm. Use este sabor:

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

ou esse sabor, se você precisar de SSH:

git+ssh://[email protected]/visionmedia/express.git
Peter Lyons
fonte
86
Você também pode git+https://github.com/visionmedia/express.gitusar https em vez de ssh.
21713 Steve Stevecock
43
Note-se que repositório você deseja instalar deve ser um módulo npm , ele deve conter um package.jsonarquivo ou então você irá obter este erro: Error: ENOENT, open 'tmp.tgz-unpack/package.json'.
26814 GabLeRoux
20
e se eu quiser um ramo específico
kilianc 22/10/2014
3
Única solução que eu acho que por agora é especificar um commit com ... / express.git # comprometer
Gaston Sanchez
39
Vale dizer que você pode precisar para escapar do #que usar um ramo específico do shell, ou seja:npm install git+https://github.com/user/repo.git\#branch
mor
656

Você também pode fazer npm install visionmedia/expressa instalação no Github

ou

npm install visionmedia/express#branch

Também há suporte para a instalação diretamente de um Gist, Bitbucket, Gitlab e vários outros formatos especializados. Veja a npm install documentação para todos eles.

user2487135
fonte
19
O que, sem especificar o URL? Como a npm sabe qual serviço de hospedagem de sabores você está usando?
Jake Rayson
22
@ Jake Rayson: é possível desde a versão 1.1.65 e funciona github.comapenas.
Ezze
5
Não funcionou para mim no Windows - apenas tentou instalar a partir de uma subpasta do meu diretório atual.
precisa
7
Nota Isso não funciona em instalações globais (ou seja npm i repo / pkg -g) a partir de NPM 1.4.28
user3751385
1
@ user3751385 As instalações globais parecem estar funcionando no npm 3.3.8.
XåpplI'-I0llwlg'I - 23/10/2015
170

Se o git não estiver instalado, podemos tentar

npm install --save https://github.com/Amitesh/gulp-rev-all/tarball/master
Amitesh
fonte
10
Ótima resposta! Funcionou para mim enquanto outros comandos (de outras respostas) estavam presos em alguma lógica de busca do git.
Daniel Kmak
2
Você também pode usar nomes de tags no lugar de master. Provavelmente mais seguro fazê-lo dessa maneira.
MJ #
4
Bom para quando você está trabalhando com agências, você deve modificar a sua resposta para incluir uma resposta geral formato, eu não percebi o /tarball/em primeiro lugar
Lu Roman
2
Esta é a única resposta que funcionou para mim ao instalar uma dependência de dentro de um contêiner do Docker.
Fela Maslen
1
Isso também é perfeito para não exigir que o repositório inteiro seja baixado. Obrigado!
som
59

Atualização setembro de 2016

A instalação a partir dos URLs vanilla https github https agora funciona:

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

EDIÇÃO 1: existem alguns usuários comentando que você não pode fazer isso para todos os módulos porque está lendo em um sistema de controle de origem, que pode muito bem conter código inválido / descompilado / com erros. Portanto, para ficar claro (embora não seja preciso dizer): dado que o código no repositório está em um estado utilizável por npm , agora você pode lo com prazer, diretamente do github

EDIT 2: (21-10-2019) Agora estamos vivendo o "pico Typescript / React / Babel" e, portanto, a compilação JavaScript tornou-se bastante comum. Se você precisar levar em consideração a compilação, consulte prepare. Dito isto, os módulos NPM não precisam ser compilados , e é aconselhável supor que a compilação não seja o padrão, especialmente para os módulos de nós mais antigos (e possivelmente também para os novos "ESNext").

Fergie
fonte
9
Você não pode instalar nenhum pacote npm que desejar da fonte GitHub, a menos que o repositório inclua uma distpasta e a maioria não. O problema ao qual vinculei é um bug do npm - a prebuildetapa não é executada durante a instalação do GitHub. Como exemplo, tente instalar o influxo do nó / influxo do nó .
Dan Dascalescu
4
Os repositórios sem distpastas PODEM ser instalados no GitHub, por exemplo: npm install https://github.com/fergiemcdowall/search-index-adderfunciona perfeitamente.
Fergie
4
Certo, porque você tem a fonte de usabel diretamente /lib(como se você tivesse uma pasta dist). Meu argumento é que apenas a inclusão da URL do GitHub de um repositório no package.jons não garante que funcione para a instalação desse repositório. Módulos escritos em TypeScript, por exemplo, precisam enviar o código transpilado para o repositório. Eles normalmente não fazem isso, mas usam um script de pré-publicação para despejar o código .JS em uma pasta dist, que é carregada no npmjs.com.
Dan Dascalescu 19/10/19
2
Eu sei que isso é um pouco tarde, mas o truque é que na verdade o npm não tem um mapeamento 1 para 1 para os repositórios Git. Alguns projetos constroem seus arquivos de origem antes da publicação e não antes da confirmação, o que significa que NÃO estão no repositório Git, mas estariam no pacote npm - os projetos que fazem isso não funcionarão corretamente no Git. Outro exemplo de como isso pode falhar são os repositórios de macro - o projeto GitHub de Babel, por exemplo, inclui centenas de pacotes npm individuais em subpastas. Eles podem ser publicados individualmente porque o npm não é mapeado diretamente para o Git. O npm publica o que estiver no seu diretório.
John Chadwick
14
Para quem se deparar com isso mais tarde ... A partir do npm5, o npm executará qualquer preparescript para "instalações" simples, o que inclui o git deps. O que significa que os comentários acima sobre pastas de compilação e dist estão desatualizados. Qualquer pacote que configure corretamente sua compilação para execução preparefuncionará perfeitamente como um depit git sem comprometer nenhum recurso compilado no git.
Jasonkarns #
54

Também há npm install https://github.com/{USER}/{REPO}/tarball/{BRANCH}para usar um ramo diferente.

zakelfassi
fonte
Corri para esse problema ... github.com/yarnpkg/yarn/issues/2738 Consegui alterar o registro para o registro tarball do github e funcionou .. Obrigado!
21417 Matt
Isso resolveu alguns dos principais problemas de desempenho para mim. O uso de {USER} / {REPO} .git # {BRANCH} foi muito lento.
precisa
37

A principal resposta atual de Peter Lyons não é relevante nas versões recentes do NPM. Por exemplo, usar o mesmo comando que foi criticado nesta resposta agora está bom.

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

Se você tiver problemas contínuos, pode ser um problema com o pacote que você estava usando.

Colin D
fonte
Ele também redireciona para github.com/expressjs/express automaticamente agora, quando você usar este comando :)
Colin D
33

Os métodos são abordados muito bem agora na documentação de instalação do npm, bem como nas inúmeras outras respostas aqui.

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

No entanto, algo notável que mudou recentemente é o npm adicionando o preparescript para substituir o prepublishscript. Isso corrige um problema de longa data em que os módulos instalados via git não executavam o prepublishscript e, portanto, não concluíram as etapas de compilação que ocorrem quando um módulo é publicado no registro npm. Vejo https://github.com/npm/npm/issues/3055 .

Obviamente, os autores do módulo precisarão atualizar seu package.json para usar a nova preparediretiva para que isso comece a funcionar.

nextgentech
fonte
19

ATUALIZAÇÃO agora você pode fazer: npm install git://github.com/foo/bar.git
ou em package.json:

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

A forma geral da sintaxe é

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

o que significa para o seu caso, será

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

Dos documentos do npmjs:

instalação npm:

Instala o pacote do provedor git hospedado, clonando-o com git. Para um URL remoto completo do git, apenas esse URL será tentado.

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

| #semver:] é um dos arquivos git, git + ssh, git + http, git + https ou git +.

Se # for fornecido, ele será usado para clonar exatamente essa confirmação. Se o commit-ish tiver o formato #semver :, pode ser qualquer intervalo semver válido ou versão exata, e o npm procurará por tags ou refs correspondentes a esse intervalo no repositório remoto, da mesma forma que faria para uma dependência do registro. Se nem # ou

semver: é especificado, então mestre é usado.

Se o repositório fizer uso de submódulos, esses submódulos também serão clonados.

Se o pacote que está sendo instalado contiver um script de preparação, suas dependências e devDependencies serão instaladas e o script de preparação será executado antes que o pacote seja empacotado e instalado.

As seguintes variáveis ​​de ambiente git são reconhecidas pelo npm e serão adicionadas ao ambiente ao executar o git:

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

Veja a página de manual do git para detalhes.

Exemplos:

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

Instale-o diretamente:

npm install visionmedia/express

Como alternativa, você pode adicionar "express": "github:visionmedia/express"à "dependencies"seção do package.jsonarquivo e executar:

npm install
Tyler Long
fonte
9

Você também pode fazer

npm i alex-cory/fasthacks

ou

npm i github:alex-cory/fasthacks

Basicamente:

npm i user_or_org/repo_name
Alex Cory
fonte
6

Você pode instalar diretamente um repositório do github por npm installcomando, como este: npm install https://github.com/futurechallenger/npm_git_install.git --save

NOTA: No repositório que será instalado pelo comando npm:

  1. talvez você tenha que ter uma dist pasta no seu repositório, de acordo com o comentário de @Dan Dascalescu.
  2. Você definitivamente precisa ter um package.json no seu repositório! que eu esqueço de adicionar.
Bruce Lee
fonte
1
Você não precisa de uma distpasta ou qualquer código de compilação no seu repositório. Você só precisa usar um preparescript package.json.
Cameron Tacklind
4

Simples:

npm install *GithubUrl*.git --save

exemplo:

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

eu tentei npm install git+https://github.com/visionmedia/express mas isso demorou muito e eu não tinha certeza se funcionaria.

O que funcionou para mim foi - yarn add git+https://github.com/visionmedia/express.

Zephyr
fonte
-3

Tente este comando

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

esse comando funcionou para mim.

 npm install github:BlessCSS/bless#3.x -g
Rahil Lakhani
fonte
12
NÃO USE SUDO COM NPM INSTALL! prefira usar chown para mudar de dono.
Marek Fajkus
A versão é o nome da marca / filial ou a versão package.json?
Mfrachet
@MarekFajkus se instalar no Linux através de um gerenciador de pacotes usando sudo ... você vai ter que usar raiz se você quiser instalar pacotes globalmente
Ray Foss
1
@RayFoss Um ano atrasado, mas ... isso é apenas se você quiser que o pacote instalado globalmente esteja disponível para todos os usuários, o que raramente é o caso. Basta configurar o npm para instalar pacotes globais ~/node_modules, para que você nunca precise do sudo.
Mr5o1