Ho un problema simile al poster originale (@robsonrosa). Nel mio caso utilizzo il typecript che compila in una distdirectory. Sebbene sia possibile compilare il dattiloscritto nella directory principale, penso che la soluzione migliore sia generare un package.jsonfile separato nella directory dist.
Questo è simile al suggerimento di @scvnc di copiare il package.jsonma con una svolta:
Come parte del processo di creazione package.jsondel pacchetto, è necessario generare un per il pacchetto che è basato ma distinto dal package.jsonfile principale nella directory principale
La logica:
- Il
package.jsonfile 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 distdirectory e la directory dovrebbe essere la directory principale nel pacchetto.
Il file SetupPackage.tsnella mia srcdirectory verrà compilato SetupPackage.jsnella distdirectory 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.jsonma 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.jsonin un file chiamato version.txt.
- Copia il
.npmignorepacchetto 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.jsfile e il version.txtfile che crea. Questo lascia un pacchetto pulito.
Infine il package.jsonfile principale ha i seguenti script per l'uso da parte del sistema di compilazione (si assume shsia 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 installe quindi esegue npm run buildpackageche a sua volta:
- Elimina la
distdirectory garantendo una compilazione pulita.
- Compila il codice dattiloscritto in javascript.
- Esegue il
SetupPackage.jsfile che prepara distper il packaging.
- cds nella
distdirectory e vi compila il pacchetto.
Uso il version.txtfile 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.tse .npmignorese non ti è utile.