npm install do Git em uma versão específica


181

Supondo que eu escrevi um módulo para o Node.js que gostaria de manter privado. Eu sei que posso (devo) adicionar a linha:

"private": "true"

ao package.jsonarquivo e também sei que posso npm installusar este módulo usando um caminho do sistema de arquivos ou um link para um repositório git, incluindo o GitHub.

Também sei que posso colocar um caminho do sistema de arquivos ou um link para um repositório git package.json, para que a dependenciesparte possa parecer algo assim:

"dependencies": {
  "myprivatemodule": "git@github.com:..."
}

O que eu quero agora não é vincular à versão mais recente, mas a uma versão específica. A única possibilidade que conheço é vincular a um commit específico usando seu ID. Mas isso é muito menos legível e é mais fácil de manter do que usar um número de versão como 0.3.1.

Então, minha pergunta é: É possível especificar um número de versão assim e fazer com que o npm procure no repositório git o commit mais recente que inclua esta versão?

Caso contrário, como você resolve esse problema em seus projetos? Você mora com IDs de confirmação ou existe uma solução melhor para isso?

Respostas:


193

Uma dependência precisa estar disponível no registrypara ser instalada apenas especificando um versiondescritor .

Você certamente pode criar e usar seu próprio registro, e não registry.npmjs.orgse seus projetos não devem ser compartilhados publicamente.

Mas, se não estiver em um registro, precisará ser referenciado por URL ou URL Git . Para especificar uma versão com um URL Git, inclua um apropriado <commit-ish>, como uma tag, no final como um fragmento de URL .

Exemplo, para uma tag denominada 0.3.1:

"dependencies": {
  "myprivatemodule": "git@github.com:...#0.3.1"
}

Nota : O snippet acima mostra o URL base o mesmo que foi postado na pergunta.

A parte cortada ( ...) deve ser preenchida:

"myprivatemodule": "git@github.com:{owner}/{project}.git#0.3.1"

E será necessário um formato de endereço diferente quando o acesso SSH não estiver disponível:

"myprivatemodule": "git://github.com/{owner}/{project}.git#0.3.1"

Dependendo do seu sistema operacional, você também poderá linkacessar a dependência em outra pasta na qual foi clonada no Github.


1
Parece que alguns dos links deste post estão desatualizados, pois levam a 404 páginas. O que é uma pena, já que parte disso é uma informação que estou procurando há um bom tempo.
MvG 07/04

5
Marquei uma versão específica com git tag -a "1.0.0"e enviei por push git push --tags, depois adicionei o #v1.0.0no final da git+sshdependência. Mas npm updatenada acontece.
Loretoparisi

3
@loretoparisi Desculpe. Não pretendia sugerir que vera necessário adicionar . Após o #, o fragmento deve corresponder ao nome completo da tag (ou outro commit ) - no seu caso #1.0.0,.
Jonathan Lonowski

A partir de julho de 2016, hospedagem próprio registro ficou mais complicado como eles estão se movendo de couchdb para microservices
Yan Foto

3
Agora você pode fazer npm i {owner}/{project}#{tag}ou adicionar "{library}": "github:{owner}/{project}#{tag}"ao package.json em vez de usar git@github.comougit://github.com
Mike W

238

A resposta aceita não funcionou para mim. Aqui está o que estou fazendo para obter um pacote do github:

npm install --save "git://github.com/username/package.git#commit"

Ou adicionando-o manualmente no package.json:

"dependencies": {
  "package": "git://github.com/username/package.git#commit"
}

41
Se você estiver usando http / https, inclua o prefixo "git +":"package": "git+https://github.com/username/package.git#commit"
Ates Goral

4
Isso funcionou até o "npm install", mas quando tentei executar meu aplicativo, o require ('mymodule') não conseguiu encontrar o pacote. Mesmo que o pacote esteja no diretório node_modules com o mesmo nome.
Derrick

Ah, o módulo em questão não incluiu a compilação com o commit específico que eu queria, portanto, se você tiver o mesmo problema, poderá ter que compilá-lo manualmente.
Derrick

1
você também pode usar o #tagque normalmente aponta para um número de versão
deltree 28/04

1
@surjikal, você precisa marcar uma versão antes de poder usar os números de versão com o git. por exemplo, git tag -a v1.0.1 && git push --tag && git pushcomo Jonathan Lonowski também disse em um comentário.
DotnetCarpenter

80

Se por versão você quer dizer uma tag ou um release, o github fornece links de download para eles. Por exemplo, se eu quiser instalar a versão de busca 0.3.2 (não está disponível no npm), adiciono ao meu package.jsonem dependencies:

"fetch": "https://github.com/github/fetch/archive/v0.3.2.tar.gz",

A única desvantagem, quando comparada com a abordagem de hash de confirmação, é a garantia de que um hash não representa código alterado, enquanto uma tag pode ser substituída. Felizmente, isso raramente acontece.

Atualizar:

Atualmente, a abordagem que utilizo é a notação compacta de uma dependência atendida pelo GitHub:

"dependencies": {
  "package": "github:username/package#commit"
}

Onde commit pode ser qualquer commit, como uma tag. No caso do GitHub, você pode até soltar a inicial, github:pois é o padrão.


O modo de arquivamento também funciona para confirmações; por exemplo, `yarn add github.com
github

Solução mais limpa.
Charley Bodkin

8

Meu comentário de exemplo para @qubyte acima foi cortado, então aqui está algo que é mais fácil de ler ...

O método @surjikal descrito acima funciona para confirmações de ramificação, mas não para uma confirmação de árvore que eu estava tentando incluir.


O modo de arquivamento também funciona para confirmações. Por exemplo, busque @ a2fbf83

npm :

npm install  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz

fio :

yarn add  https://github.com/github/fetch/archive/a2fbf834773b8dc20eef83bb53d081863d3fc87f.tar.gz

formato :

 https://github.com/<owner>/<repo>/archive/<commit-id>.tar.gz


Aqui está o commit da árvore que exigia o /archive/modo:

yarn add  https://github.com/vuejs/vuex/archive/c3626f779b8ea902789dd1c4417cb7d7ef09b557.tar.gz

para o commit vuex relacionado


8

Este comando instala o pacote npm a username/packagepartir do commit específico do git:

npm install https://github.com/username/package#3d0a21cc

Aqui 3d0a21ccestão os 8 primeiros caracteres do hash de confirmação.


3

Descrevo aqui um problema que enfrentei ao executar npm install- o pacote não aparece node_modules.

O problema era que o namevalor package.jsondo pacote instalado era diferente do nome do pacote importado (chave package.jsondo meu projeto).

Portanto, se seu nome do projeto instalado é some-package(valor de nome em seu package.json), em seguida, package.jsonde sua gravação do projeto: "some-package": "owner/some-repo#tag".


Eu gostaria de encontrar sua resposta mais cedo 😓 - Acabei de resolver, com o mesmo problema me fazendo lutar por um tempo; e esse namerequisito não é mencionado com frequência na rede. (não que eu possa incorrer nisso, pelo menos).
Kamafeather 04/07/19

"Adicione suas dependências de pacote ao seu package.json especificando o nome do pacote com escopo completo." - Não estou realmente enfatizando: help.github.com/en/articles/…
Kamafeather 04/04/19

Eu descobri que npm install --save git+https://<remote-github-repo-url>é uma maneira bastante segura de não atingir esse problema novamente no futuro.
Kamafeather 04/04/19

2

Eu precisava executar duas versões do tfjs-core e descobri que ambas precisavam ser construídas depois de instaladas.

package.json:

"dependencies": {
  "tfjs-core-0.14.3": "git://github.com/tensorflow/tfjs-core#bb0a830b3bda1461327f083ceb3f889117209db2",
  "tfjs-core-1.1.0": "git://github.com/tensorflow/tfjs-core#220660ed8b9a252f9d0847a4f4e3c76ba5188669"
}

Então:

cd node_modules/tfjs-core-0.14.3 && yarn install && yarn build-npm && cd ../../
cd node_modules/tfjs-core-1.1.0  && yarn install && yarn build-npm && cd ../../

E, finalmente, para usar as bibliotecas:

import * as tf0143 from '../node_modules/tfjs-core-0.14.3/dist/tf-core.min.js';
import * as tf110 from '../node_modules/tfjs-core-1.1.0/dist/tf-core.min.js';

Isso funcionou muito bem, mas é certamente #hoodrat


1
Obrigado, tenho tentado importá-lo de qualquer outra maneira imaginável. Eu tive que ver seu snippet para perceber que precisava importar diretamente do arquivo.
Victor Ivens

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.