Tengo un problema similar al del cartel original (@robsonrosa). En mi caso, uso mecanografiado que se compila en un distdirectorio. Si bien podría compilar mecanografiado en el directorio raíz, creo que la mejor solución es generar un package.jsonarchivo separado en el directorio dist.
Esto es similar a la sugerencia de @scvnc de copiar el package.jsonpero con un giro:
Como parte del proceso de empaquetado, debe generar un archivo package.jsonpara el paquete que se base en el package.jsonarchivo principal del directorio raíz pero sea distinto del mismo.
Lo racional:
- El
package.jsonarchivo raíz es el archivo de desarrollo. Puede contener scripts o dependencias de desarrollo que no son útiles para el usuario del paquete, pero pueden plantearle problemas de seguridad. Su procedimiento de empaque puede incluir un código que elimine esa información de la producción package.json.
- Es posible que desee implementar su paquete en diferentes entornos que pueden requerir diferentes archivos de paquete (por ejemplo, es posible que desee tener diferentes versiones o dependencias).
--- EDITAR ---
Se me pidió una solución en los comentarios. Así que aquí hay un código que estoy usando. Esto debe considerarse como un ejemplo, no pretende ser genérico y es específico de mis proyectos.
Mi configuración:
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.
Quiero empaquetar solo el distdirectorio y el directorio debe ser el directorio raíz del paquete.
El archivo SetupPackage.tsen mi srcdirectorio se compilará SetupPackage.jsen el distdirectorio por mecanografiado:
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 archivo:
- Copia la raíz
package.jsonpero elimina los scripts y las dependencias de desarrollo que no son necesarios en el paquete. También corrige el punto de entrada principal al paquete.
- Escribe la versión del paquete
package.jsonen un archivo llamado version.txt.
- Copia el
.npmignorepaquete desde la raíz.
El contenido .npmignore es:
*.map
*.spec.*
SetupPackage.*
version.txt
Es decir, las pruebas unitarias (archivos de especificaciones) y los archivos de mapas mecanografiados se ignoran, así como el SetupPackage.jsarchivo y el version.txtarchivo que crea. Esto deja un paquete limpio.
Finalmente, el package.jsonarchivo principal tiene los siguientes scripts para que los utilice el sistema de compilación (se supone que shse utiliza como 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 compilar el paquete, el sistema de compilación clona el repositorio, lo hace npm instally luego lo ejecuta, lo npm run buildpackageque a su vez:
- Elimina el
distdirectorio asegurando una compilación limpia.
- Compila el código mecanografiado en javascript.
- Ejecuta el
SetupPackage.jsarchivo que prepara distpara empaquetar.
- cds al
distdirectorio y compila el paquete allí.
Utilizo el version.txtarchivo como una manera fácil de obtener la versión en package.json y etiquetar mi repositorio. Hay muchas otras formas de hacer esto o puede que desee incrementar automáticamente la versión. Elimínelo de SetupPackage.tsy .npmignoresi no le resulta útil.