Tengo un problema similar al del cartel original (@robsonrosa). En mi caso, uso mecanografiado que se compila en un dist
directorio. Si bien podría compilar mecanografiado en el directorio raíz, creo que la mejor solución es generar un package.json
archivo separado en el directorio dist.
Esto es similar a la sugerencia de @scvnc de copiar el package.json
pero con un giro:
Como parte del proceso de empaquetado, debe generar un archivo package.json
para el paquete que se base en el package.json
archivo principal del directorio raíz pero sea distinto del mismo.
Lo racional:
- El
package.json
archivo 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 dist
directorio y el directorio debe ser el directorio raíz del paquete.
El archivo SetupPackage.ts
en mi src
directorio se compilará SetupPackage.js
en el dist
directorio 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.json
pero 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.json
en un archivo llamado version.txt
.
- Copia el
.npmignore
paquete 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.js
archivo y el version.txt
archivo que crea. Esto deja un paquete limpio.
Finalmente, el package.json
archivo principal tiene los siguientes scripts para que los utilice el sistema de compilación (se supone que sh
se 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 install
y luego lo ejecuta, lo npm run buildpackage
que a su vez:
- Elimina el
dist
directorio asegurando una compilación limpia.
- Compila el código mecanografiado en javascript.
- Ejecuta el
SetupPackage.js
archivo que prepara dist
para empaquetar.
- cds al
dist
directorio y compila el paquete allí.
Utilizo el version.txt
archivo 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.ts
y .npmignore
si no le resulta útil.