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 install
me 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.
fonte
package.json
arquivo do seu fork, emscripts
, renomearprepublish
paraprepare
. Parece que quandonpm install
ounpm install github:user_name/fork_name --save
(e o mesmo para o fio) é executado, ele também executa o que está noprepare
script. Isso pressupõe que oprepublish
script deste pacote crie os arquivos de compilação, o que geralmente é o caso.npm install <ghusername>/<repoName>#branchName
prepare
roteiro, suadependencies
edevDependencies
será instalado, ea preparar script será executado, antes do pacote é empacotado e instalado."Atualização para aqueles que usam o npm 5:
Eu achei que adicionar um
"prepare": "npm run build"
script corrigiu todos os meus problemas.fonte
npm run build
enpm run publish
não enfrentam problemas ou problemas, a menos que algum dia tentem instalar o repositório via git?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
npm
executar automaticamente uma etapa de "construção" antes de publicar (npm publish
). Isso foi chamado originalmenteprepublish
. Parece que o Npm pensou que seria útil também executar oprepublish
script em umanpm install
vez 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:
prepublishOnly
eprepare
.prepublishOnly
faz o que você espera. Não funcionanpm 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
prepare
foi adicionado para lidar com ...prepare
é a maneira corretaSe você possui um repositório com arquivos de origem, mas é necessário usar uma etapa "build",
prepare
faça exatamente o que deseja em todos os casos (a partir da npm 4).Você pode até colocar suas dependências de compilação
devDependencies
e elas serão instaladas antes daprepare
execuçã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
files
seçãopackage.json
.Pode-se ver que o
files
padrão é que todos os arquivos sejam incluídos e pensar que estão concluídos. O que é facilmente esquecido é que a.npmignore
maioria substitui afiles
diretiva e , se.npmignore
não existe,.gitignore
é usada.Então, se você tem seus arquivos construídos listados na
.gitignore
como uma pessoa sã, e não fazer qualquer outra coisa,prepare
vai parecer quebradoSe você corrigir
files
para 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
fonte
Seguir a excelente resposta de @ RyanZim,
postinstall
é definitivamente uma opção válida para isso.Siga um destes procedimentos:
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.
fonte
"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.postinstall
está a um passo da solução certa. Apenas useprepare
. É 2020.Basta usar o comando
npm install git+https://[email protected]/myRepo/angular-translate.git
. Obrigado.fonte