Eu tenho um projeto que inclui uma tarefa gulp para compilar e empacotar os códigos-fonte e liberar em um diretório chamado dist
. Meu objetivo é publicá-lo como um pacote npm, mas apenas minha pasta dist. A documentação do npm diz que posso usar a files
tag para especificar os arquivos a serem exportados. Funciona. Mas, a documentação também diz que:
Se você nomear uma pasta na matriz, ela também incluirá os arquivos dentro dessa pasta
O resultado é um pacote npm, cujo node_modules se parece com:
Mas gostaria de ver todos os meus arquivos na raiz do pacote (sem essa dist
pasta). Meu index.js
arquivo está dentro da dist
pasta, mas deve estar na raiz. Tentei definir a tag files
como, /dist/**/*
mas não funcionou.
Como posso conseguir isso?
fonte
npm pack
, o package.jsonfiles
e osmain
campos, e.npmignore
fornece ao desenvolvedor tudo o que é necessário para criar um pacote a partir de um diretório instalável específico.Tenho um problema semelhante ao do autor da postagem original (@robsonrosa). No meu caso, eu uso o typecript que compila em um
dist
diretório. Embora eu possa fazer a compilação do typescript para o diretório raiz, acho que a melhor solução é gerar umpackage.json
arquivo separado no diretório dist.Isso é semelhante à sugestão @scvnc de copiar o,
package.json
mas com uma torção:Como parte do processo de empacotamento, você deve gerar um
package.json
para o pacote que se baseia, mas é diferente dopackage.json
arquivo principal no diretório raizA justificativa:
package.json
arquivo raiz é o arquivo de desenvolvimento. Ele pode conter scripts ou dependências de desenvolvimento que não são úteis para o usuário do pacote, mas podem representar questões de segurança para você. Seu procedimento de embalagem pode incluir um código que retira essas informações da produçãopackage.json
.--- EDITAR ---
Pediram-me uma solução nos comentários. Portanto, aqui está um código que estou usando. Isso deve ser considerado como um exemplo, não se destina a ser genérico e é específico para meus projetos.
Minha configuração:
Desejo empacotar apenas o
dist
diretório e o diretório deve ser o diretório raiz do pacote.O arquivo
SetupPackage.ts
em meusrc
diretório será compiladoSetupPackage.js
nodist
diretório por typescript:Este ficheiro:
package.json
mas remove os scripts e dependências de desenvolvimento que não são necessários no pacote. Ele também corrige o principal ponto de entrada do pacote.package.json
em um arquivo chamadoversion.txt
..npmignore
pacote da raiz.O conteúdo .npmignore é:
Ou seja, os testes de unidade (arquivos de especificação) e os arquivos de mapa de digitação são ignorados, assim como o
SetupPackage.js
arquivo e oversion.txt
arquivo que ele cria. Isso deixa um pacote limpo.Finalmente, o
package.json
arquivo principal tem os seguintes scripts para uso pelo sistema de compilação (assume quesh
é usado como o shell).Para construir o pacote, o sistema de compilação clona o repo, faz
npm install
e, em seguida, executa onpm run buildpackage
que, por sua vez:dist
diretório garantindo uma compilação limpa.SetupPackage.js
arquivo que preparadist
para empacotamento.dist
diretório e cria o pacote lá.Eu uso o
version.txt
arquivo como uma maneira fácil de obter a versão em package.json e marcar meu repo. Existem inúmeras outras maneiras de fazer isso ou você pode querer incrementar automaticamente a versão. Remova isso deSetupPackage.ts
e.npmignore
se não for útil para você.fonte
SetupPackage.ts
arquivo atual copia os arquivos para osrc
diretório em vez dedist
. Obrigado 👍Se seu projeto tem git, você pode usar o pequeno hack. Adicione os próximos scripts a package.json
agora, quando você executa o
publish
comando npm envolveprepublishOnly
. Ele cria arquivos e os salva em umalib
pasta (um script de construção depende do seu projeto). O próximo comando copia os arquivos para a pasta raiz e os removelib
. Após a publicação, opostpublish
script retorna o projeto a um estado anterior.fonte
Eu recomendo fortemente que você use ao
.npmignore
invés de mover ou copiar coisas, especialmente se você estiver usando um CI para implantações, e apenas adicionar lá os arquivos que você não deseja publicar.https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package
Exemplo:
Atualizar:
Se você quiser dividir seu código em diferentes pacotes npm usando o mesmo repo, me deparei com este projeto recentemente: Lerna e parece realmente bom.
Talvez você devesse dar uma olhada
fonte
require('mypackage/foo')
require('mypackage/dist/foo')
Este trabalho é bom para mim.
cd TMPDIR;
npm pack
/path/to/package.jsonO Tarball criará dentro do diretório TMPDIR.
fonte
npm pack
mais ofiles
campo package.json (ou.npmignore
) funciona maravilhosamente bem.Se você estiver (e eu recomendo) usando liberação semântica , adicione a
pkgRoot
opção no.releaserc.json
arquivo:{ "pkgRoot": "dist", "plugins": [ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", "@semantic-release/npm", [ "@semantic-release/exec", { "prepareCmd": "npx rjp package.json version nextRelease.version" } ], [ "@semantic-release/git", { "assets": ["package.json"] } ], ], }
Isso resolverá o problema. Apenas certifique-se de que sua
dist
pasta contém umpackage.json
arquivo. Você pode fazer isso facilmente adicionando umcp
ao seupostbuild
script. Também instale o rjpfonte
Você precisa publicar a
dist
pastaA maneira natural de conseguir isso, de acordo com a abordagem do npm, é publicar a pasta que será a raiz. Existem várias maneiras de fazer isso, dependendo do ambiente final com o qual você deseja trabalhar:
npm publish dist
.npm install relative/path/to/dist
node_modules
em outro projeto, caso deseje que as alterações no pacote original sejam refletidas instantaneamente em outro projeto. No seu caso, você primeirocd dist
executanpm link
e depois vai para o outro projeto e executanpm link robsonrosa-ui-alert
.Pré - requisito : em qualquer caso acima, antes de publicar / instalar / vincular, você deve colocar em sua
dist
pasta pelo menos umpackage.json
arquivo adequado . No seu caso, você deve ter o nome do pacote definido em seu arquivo package.json como"name": "robsonrosa-ui-alert"
. Normalmente, você também desejará alguns outros arquivos como README.md ou LICENSE.Observações aos métodos 2 e 3
Normalmente, há problemas com dependências de pacote quando você usa o pacote instalado dessa maneira. Para evitá-lo, primeiro empacote o pacote
npm pack dist
e depois instale-o no projeto de destino a partir do tarball compactado, ou sejanpm install path/to/package-tarball.tgz
.Exemplo de automação
Você pode automatizar o processo de publicação usando o
prepare
script , combinado com obuild
script. Além disso, você pode proteger seu pacote contra uma publicação acidental da pasta raiz do pacote com o"private": true
campo colocado em package.json, localizado no diretório raiz de seu repo de pacote. Aqui está um exemplo:"private": true, "scripts": { "build": "rm -rf dist && gulp build && cat ./package.json | grep -v '\"private\":' > dist/package.json", "prepare": "npm run build" },
Dessa forma, você não publicará a pasta raiz e obterá o pacote criado e o package.json copiado para a
dist
pasta automaticamente, dentro do processo de publicação.fonte
Aqui está mais uma abordagem que considero a mais limpa. É tudo baseado em configuração, sem a necessidade de mover arquivos ou especificar caminhos nos scripts de compilação e pacote:
package.json
Especifique o arquivo principal.Algumas opções adicionais de datilografia:
rootDir
. Este diretório terá todo o código fonte e deverá conter umindex
arquivo (ou algum outro arquivo que você possa usar como principal nopackage.json
).outDir
. É aqui que o seu comando tsc será construído paratsconfig.json
fonte
opção 1: navegue até a pasta e execute "npm publish." comando
opção 2: execute npm publicar / caminho / diretório
fonte
Basta criar um
.npmignore
arquivo e adicionar o seguinte a ele:fonte