Ho un problema simile al poster originale (@robsonrosa). Nel mio caso utilizzo il typecript che compila in una dist
directory. Sebbene sia possibile compilare il dattiloscritto nella directory principale, penso che la soluzione migliore sia generare un package.json
file separato nella directory dist.
Questo è simile al suggerimento di @scvnc di copiare il package.json
ma con una svolta:
Come parte del processo di creazione package.json
del pacchetto, è necessario generare un per il pacchetto che è basato ma distinto dal package.json
file principale nella directory principale
La logica:
- Il
package.json
file radice è il file di sviluppo. Può contenere script o dipendenze di sviluppo che non sono di alcuna utilità per l'utente del pacchetto, ma possono porre problemi di sicurezza per te. La procedura di confezionamento può includere un codice che elimina tali informazioni dalla produzione package.json
.
- Potresti voler distribuire il tuo pacchetto in ambienti diversi che potrebbero richiedere file di pacchetto differenti (ad esempio potresti voler avere versioni o dipendenze differenti).
--- MODIFICARE ---
Mi è stata chiesta una soluzione nei commenti. Quindi ecco del codice che sto usando. Questo dovrebbe essere considerato come un esempio, non vuole essere generico ed è specifico per i miei progetti.
La mia configurazione:
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.
Voglio creare un pacchetto solo per la dist
directory e la directory dovrebbe essere la directory principale nel pacchetto.
Il file SetupPackage.ts
nella mia src
directory verrà compilato SetupPackage.js
nella dist
directory tramite dattiloscritto:
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();
Questa vita:
- Copia la root
package.json
ma rimuove gli script e le dipendenze dev che non sono necessarie nel pacchetto. Risolve anche il punto di ingresso principale del pacchetto.
- Scrive la versione del pacchetto da
package.json
in un file chiamato version.txt
.
- Copia il
.npmignore
pacchetto dalla radice.
Il contenuto .npmignore è:
*.map
*.spec.*
SetupPackage.*
version.txt
Vale a dire gli unit test (file spec) e i file di mappa del dattiloscritto vengono ignorati così come il SetupPackage.js
file e il version.txt
file che crea. Questo lascia un pacchetto pulito.
Infine il package.json
file principale ha i seguenti script per l'uso da parte del sistema di compilazione (si assume sh
sia usato come shell).
"scripts": {
"compile": "tsc",
"clean": "rm -rf dist",
"prebuildpackage": "npm run clean && npm run compile && node dist/SetupPackage.js",
"buildpackage": "cd dist && npm pack"
},
Per creare il pacchetto, il sistema di compilazione clona il repository, lo fa npm install
e quindi esegue npm run buildpackage
che a sua volta:
- Elimina la
dist
directory garantendo una compilazione pulita.
- Compila il codice dattiloscritto in javascript.
- Esegue il
SetupPackage.js
file che prepara dist
per il packaging.
- cds nella
dist
directory e vi compila il pacchetto.
Uso il version.txt
file come un modo semplice per ottenere la versione in package.json e per taggare il mio repository. Ci sono innumerevoli altri modi per farlo o potresti voler incrementare automaticamente la versione. Rimuovilo da SetupPackage.ts
e .npmignore
se non ti è utile.