Tenho um problema semelhante ao do autor da postagem original (@robsonrosa). No meu caso, eu uso o typecript que compila em um distdiretório. Embora eu possa fazer a compilação do typescript para o diretório raiz, acho que a melhor solução é gerar um package.jsonarquivo separado no diretório dist.
Isso é semelhante à sugestão @scvnc de copiar o, package.jsonmas com uma torção:
Como parte do processo de empacotamento, você deve gerar um package.jsonpara o pacote que se baseia, mas é diferente do package.jsonarquivo principal no diretório raiz
A justificativa:
- O
package.jsonarquivo 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ção package.json.
- Você pode querer implantar seu pacote em ambientes diferentes que podem exigir arquivos de pacote diferentes (por exemplo, você pode querer ter versões ou dependências diferentes).
--- 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:
package.json - main package.json with dev dependencies and useful scripts.
.npmignore - files to ignore; copied to 'dist' directory as part of the setup.
/src - directory where my typescript code resides.
/src/SetupPackage.ts - bit of code used to setup the package.
/dist - destination directory for the compiled javascript files.
Desejo empacotar apenas o distdiretório e o diretório deve ser o diretório raiz do pacote.
O arquivo SetupPackage.tsem meu srcdiretório será compilado SetupPackage.jsno distdiretório por typescript:
import fs from "fs";
// DO NOT DELETE THIS FILE
// This file is used by build system to build a clean npm package with the compiled js files in the root of the package.
// It will not be included in the npm package.
function main() {
const source = fs.readFileSync(__dirname + "/../package.json").toString('utf-8');
const sourceObj = JSON.parse(source);
sourceObj.scripts = {};
sourceObj.devDependencies = {};
if (sourceObj.main.startsWith("dist/")) {
sourceObj.main = sourceObj.main.slice(5);
}
fs.writeFileSync(__dirname + "/package.json", Buffer.from(JSON.stringify(sourceObj, null, 2), "utf-8") );
fs.writeFileSync(__dirname + "/version.txt", Buffer.from(sourceObj.version, "utf-8") );
fs.copyFileSync(__dirname + "/../.npmignore", __dirname + "/.npmignore");
}
main();
Este ficheiro:
- Copia a raiz,
package.jsonmas 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.
- Grava a versão do pacote
package.jsonem um arquivo chamado version.txt.
- Copia o
.npmignorepacote da raiz.
O conteúdo .npmignore é:
*.map
*.spec.*
SetupPackage.*
version.txt
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.jsarquivo e o version.txtarquivo que ele cria. Isso deixa um pacote limpo.
Finalmente, o package.jsonarquivo principal tem os seguintes scripts para uso pelo sistema de compilação (assume que shé usado como o shell).
"scripts": {
"compile": "tsc",
"clean": "rm -rf dist",
"prebuildpackage": "npm run clean && npm run compile && node dist/SetupPackage.js",
"buildpackage": "cd dist && npm pack"
},
Para construir o pacote, o sistema de compilação clona o repo, faz npm installe, em seguida, executa o npm run buildpackageque, por sua vez:
- Exclui o
distdiretório garantindo uma compilação limpa.
- Compila o código typescript para javascript.
- Executa o
SetupPackage.jsarquivo que prepara distpara empacotamento.
- cds para o
distdiretório e cria o pacote lá.
Eu uso o version.txtarquivo 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 de SetupPackage.tse .npmignorese não for útil para você.