npm: instalação e construção do repositório bifurcado do github

125

Esta não é uma pergunta totalmente nova, mas estou procurando há um bom tempo e estou tendo problemas para encontrar uma solução.

Estou usando um módulo para meu aplicativo angular chamado angular-translate. No entanto, eu tive que fazer algumas pequenas modificações no código-fonte para fazer tudo funcionar da maneira que eu gostaria, e agora quero persistir nessas alterações npm install. Um colega sugeriu que eu bifurque o repositório do código-fonte e aponte para o repositório bifurcado como uma dependência, que tentei dessa maneira, por exemplo

npm install https://github.com/myRepo/angular-translate
npm install https://github.com/myRepo/angular-translate/archive/master.tar.gz

O primeiro me fornece um diretório como este sem compilação. Apenas um package.json, .npmignore e alguns arquivos de descontos

-angular-translate
   .npmignore 
   .nvmrc
    CHANGELOG.md 
    package.json
    etc

O segundo npm installme fornece o repositório completo, mas novamente não recebo uma compilação como quando uso o comando npm install angular-translate. Eu já vi algumas discussões sobre a execução do script de pré-publicação, mas não sei como fazer isso ao instalar todos os módulos. Também tentei publicar a bifurcação como meu próprio módulo no registro npm, mas novamente não recebo compilação e não tenho certeza se é a coisa certa a fazer ...

Peço desculpas pela minha ignorância sobre o assunto. Não tenho muita experiência com npm. Gostaria de receber algum feedback sobre esta questão. Parece que pode ser um problema bastante comum quando modificações precisam ser feitas no código-fonte de um pacote? Talvez haja uma solução melhor? Agradeço antecipadamente por sua ajuda.

hughesjmh
fonte

Respostas:

139

Tente npm install <ghusername>/<repoName>, onde <ghUsername>está o seu nome de usuário no GitHub (sem o @) e <repoName>é o nome do repositório. Isso deve instalá-lo corretamente. Você provavelmente desejará usar o sinalizador --saveou --save-devcom o comando install para salvar a dependência no seu package.json.

Se isso não estiver funcionando corretamente, verifique o conteúdo do seu .npmignorearquivo.

Não entre em pânico se o comando de instalação demorar muito; instalar a partir de um repositório git é mais lento que instalar a partir do registro npm.


Editar:

Seu problema é que, no seu caso, dist/não está comprometido com o repo (já que está no .gitignore). É aí que vive o código real. dist/é criado a partir dos arquivos src/antes da publicação do pacote no registro npm, mas dist/nunca é confirmado no repositório.

É feio, mas, neste caso, você terá que remover dist/do .gitignoree executar:

npm run build
git add .
git commit
git push

(Verifique se você executou npm installprimeiro)

Você deve conseguir instalar no github.

Pode haver outra maneira de fazer isso usando um postinstallscript, mas não tenho certeza se isso é possível; Eu nunca tentei.

RyanZim
fonte
2
Sim, essa foi praticamente a solução. Também tive que instalar o npm e modificar um pouco o GruntFile, mas isso funcionou. Obrigado pela vossa ajuda :)
hughesjmh
2
Realmente não há outra maneira de fazer isso além de ignorar dist? Quero fazer um PR para o repo original, mas com o dist, ele não vai gostar?
Ka Mok
7
@ KaMok Eu acho que outra opção é, no package.jsonarquivo do seu fork, em scripts, renomear prepublishpara prepare. Parece que quando npm installou npm install github:user_name/fork_name --save(e o mesmo para o fio) é executado, ele também executa o que está no preparescript. Isso pressupõe que o prepublishscript deste pacote crie os arquivos de compilação, o que geralmente é o caso.
Davidfrancisco
5
e se você precisar de um ramo específico,npm install <ghusername>/<repoName>#branchName
DrMeers
2
@RyanZim Você está incorreto. A instalação do git funciona muito bem, desde que esteja configurada corretamente. docs.npmjs.com/cli/install "Se o pacote que está sendo instalado contém um prepareroteiro, sua dependenciese devDependenciesserá instalado, ea preparar script será executado, antes do pacote é empacotado e instalado."
Cameron Tacklind
15

Atualização para aqueles que usam o npm 5:

A partir do npm @ 5, os prepublishscripts estão obsoletos.

Use preparepara etapas de criação e prepublishOnlysomente para upload.

Eu achei que adicionar um "prepare": "npm run build"script corrigiu todos os meus problemas.

Simon
fonte
Também funcionou para mim (num garfo que acabei de fazer) - obrigado! Eu me pergunto ... por que todos os pacotes não incluem apenas essa configuração de script por padrão? É porque os autores do pacote consideram apenas o caso de uso da instalação do pacote a partir do npm e não o caso de instalá-lo a partir de um repositório git? Então, eles estão acostumados a executar manualmente npm run builde npm run publishnão enfrentam problemas ou problemas, a menos que algum dia tentem instalar o repositório via git?
Tyler Rick
9

O código publicado no npmjs.com geralmente não é o que está no repositório do pacote. É comum "compilar" arquivos de origem JavaScript em versões destinadas ao consumo geral em bibliotecas. É o que geralmente é publicado no npmjs.com.

É tão comum que é um recurso npmexecutar automaticamente uma etapa de "construção" antes de publicar ( npm publish). Isso foi chamado originalmente prepublish. Parece que o Npm pensou que seria útil também executar o prepublishscript em uma npm installvez que essa era a maneira padrão de inicializar um ambiente de desenvolvimento.

Isso acabou causando uma grande confusão na comunidade. Existem questões muito longas no github sobre isso.

No final, em um esforço para não mudar o comportamento antigo, eles decidiram adicionar mais dois scripts automáticos: prepublishOnlye prepare.

prepublishOnlyfaz o que você espera. Não funciona npm install. Muitos mantenedores de pacotes mudaram cegamente para isso.

Mas havia também esse problema que as pessoas queriam não depender do npmjs.com para distribuir versões de pacotes. Os repositórios Git foram a escolha natural. No entanto, é prática comum não comprometer arquivos "compilados" no git. Foi isso que preparefoi adicionado para lidar com ...

prepare é a maneira correta

Se você possui um repositório com arquivos de origem, mas é necessário usar uma etapa "build",
preparefaça exatamente o que deseja em todos os casos (a partir da npm 4).

prepare: Execute ambos ANTES que o pacote seja compactado e publicado, no local, npm installsem argumentos, e ao instalar dependências git.

Você pode até colocar suas dependências de compilação devDependenciese elas serão instaladas antes da prepareexecução.

Aqui está um exemplo de um pacote meu que usa esse método.


Problemas com .gitignore

Há um problema com essa opção que atrai muitas pessoas. Ao preparar uma dependência, o Npm e o Yarn manterão apenas os arquivos listados na filesseção package.json.

Pode-se ver que o filespadrão é que todos os arquivos sejam incluídos e pensar que estão concluídos. O que é facilmente esquecido é que a .npmignore maioria substitui a filesdiretiva e , se .npmignorenão existe, .gitignoreé usada.

Então, se você tem seus arquivos construídos listados na .gitignorecomo uma pessoa sã, e não fazer qualquer outra coisa, preparevai parecer quebrado

Se você corrigir filespara incluir apenas os arquivos criados ou adicionar um vazio .npmignore, está tudo pronto.

Minha recomendação é definir files(ou, por inversão .npmignore), para que os únicos arquivos realmente publicados sejam os necessários para os usuários do pacote publicado. No entanto, não há necessidade de incluir fontes não compiladas nos pacotes publicados.


Resposta original: https://stackoverflow.com/a/57503862/4612476

Cameron Tacklind
fonte
1
PREPARE funcionou para mim em vez de POSTINSTALL.i apenas executei o npm run build no prepare.
Milind
6

Seguir a excelente resposta de @ RyanZim, postinstallé definitivamente uma opção válida para isso.

Siga um destes procedimentos:

  1. Atualize o package.json no seu repositório bifurcado para adicionar um elemento pós-instalação aos scripts. Aqui, execute o que for necessário para obter a saída compilada (Preferred).
  2. Atualize seu package.json e inclua uma pós-instalação que atualize o diretório necessário em node_modules.

Se você bifurcou outro repositório de pessoas, pode valer a pena levantar um problema para ilustrar o problema de que a instalação do pacote por meio do GitHub não funciona, pois não fornece os meios necessários para construir o script. A partir daí, eles podem aceitar um PR para resolver isso com uma pós-instalação ou podem rejeitá-lo e você pode fazer o segundo.

Mike B
fonte
Você pode explicar ou ter algum recurso sobre como fazer o # 2? Que comandos que eu preciso correr atrás npm instalar quando o gitrepo não contém apenas src dist
Daniel
1
@ Daniel Desculpas, estou tentando lembrar o contexto de onde eu fiz isso no passado. Eu acho que no nº 2 eu pretendia adicionar uma etapa pós-instalação aos seus principais packages.json que executariam as etapas para a resposta superior, portanto, algo "postinstall": "cd node_modules/scrape-twitter/ && npm install && npm run build"como garantir que o pacote que está causando problemas seja criado antes da execução do aplicativo. Porém, como já disse, prefiro a abordagem de bifurcar o repositório para o meu próprio usuário, adicionar o pós-instalação ao próprio pacote e usá-lo no meu aplicativo.
Mike B
Eu acho que adicionar ao preparar deve ser o preferido (resposta do @ Simon), porque se você estiver instalando a partir do npm, você não precisará fazer nenhum edifício adicional, pois ele já deve incluir um dist / dir. Veja docs.npmjs.com/misc/scripts : "prepare: Execute ambos ANTES que o pacote seja empacotado e publicado, ... e ao instalar dependências git"
Tyler Rick
postinstallestá a um passo da solução certa. Apenas use prepare. É 2020.
Cameron Tacklind
2

Basta usar o comando npm install git+https://[email protected]/myRepo/angular-translate.git. Obrigado.

Bimal Jha
fonte