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 um package.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 do package.json
arquivo principal no diretório raiz
A justificativa:
- O
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çã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 dist
diretório e o diretório deve ser o diretório raiz do pacote.
O arquivo SetupPackage.ts
em meu src
diretório será compilado SetupPackage.js
no dist
diretó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.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.
- Grava a versão do pacote
package.json
em um arquivo chamado version.txt
.
- Copia o
.npmignore
pacote 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.js
arquivo e o version.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 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 install
e, em seguida, executa o npm run buildpackage
que, por sua vez:
- Exclui o
dist
diretório garantindo uma compilação limpa.
- Compila o código typescript para javascript.
- Executa o
SetupPackage.js
arquivo que prepara dist
para empacotamento.
- cds para o
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 de SetupPackage.ts
e .npmignore
se não for útil para você.