Ich habe ein ähnliches Problem wie das Originalposter (@robsonrosa). In meinem Fall verwende ich typecript, das in ein distVerzeichnis kompiliert wird . Obwohl ich Typoskript in das Stammverzeichnis kompilieren lassen könnte, denke ich, dass die beste Lösung darin besteht, eine separate package.jsonDatei im dist-Verzeichnis zu generieren .
Dies ähnelt dem Vorschlag von @scvnc, das zu kopieren, package.jsonjedoch mit einer Wendung:
Als Teil des Verpackungsprozesses sollten Sie eine package.jsonfür das Paket generieren , die auf der Hauptdatei package.jsonim Stammverzeichnis basiert, sich jedoch von dieser unterscheidet
Das Grundprinzip:
- Die Stammdatei
package.jsonist die Entwicklungsdatei. Es kann Skripte oder Entwicklungsabhängigkeiten enthalten, die für den Paketbenutzer nicht von Nutzen sind, aber Sicherheitsbedenken für Sie aufwerfen können. Ihr Verpackungsverfahren kann Code enthalten, der diese Informationen aus der Produktion entfernt package.json.
- Möglicherweise möchten Sie Ihr Paket in verschiedenen Umgebungen bereitstellen, für die möglicherweise unterschiedliche Paketdateien erforderlich sind (z. B. möchten Sie möglicherweise unterschiedliche Versionen oder Abhängigkeiten haben).
--- BEARBEITEN ---
Ich wurde in den Kommentaren nach einer Lösung gefragt. Hier ist ein Code, den ich verwende. Dies sollte als Beispiel betrachtet werden, es ist nicht generisch gedacht und ist spezifisch für meine Projekte.
Mein Setup:
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.
Ich möchte nur das distVerzeichnis verpacken und das Verzeichnis sollte das Stammverzeichnis im Paket sein.
Die Datei SetupPackage.tsin meinem srcVerzeichnis wird per Typoskript SetupPackage.jsin das distVerzeichnis kompiliert :
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();
Diese Datei:
- Kopiert das Stammverzeichnis
package.json, entfernt jedoch die Skripte und Entwicklungsabhängigkeiten, die im Paket nicht benötigt werden. Außerdem wird der Haupteinstiegspunkt für das Paket festgelegt.
- Schreibt die Version des Pakets aus
package.jsonin eine aufgerufene Datei version.txt.
- Kopiert das
.npmignorePaket aus dem Stammverzeichnis.
Der .npmignore-Inhalt lautet:
*.map
*.spec.*
SetupPackage.*
version.txt
Dh Unit-Tests (Spezifikationsdateien) und Typoskript-Map-Dateien werden ebenso ignoriert wie die SetupPackage.jsDatei und die version.txtDatei, die sie erstellt. Dies hinterlässt ein sauberes Paket.
Schließlich enthält die Hauptdatei package.jsondie folgenden Skripts zur Verwendung durch das Build-System (vorausgesetzt, sie shwird als Shell verwendet).
"scripts": {
"compile": "tsc",
"clean": "rm -rf dist",
"prebuildpackage": "npm run clean && npm run compile && node dist/SetupPackage.js",
"buildpackage": "cd dist && npm pack"
},
Um das Paket zu erstellen, klont das Build-System das Repo, führt es aus npm installund führt es dann aus, npm run buildpackagewas wiederum:
- Löscht das
distVerzeichnis, um eine saubere Kompilierung zu gewährleisten.
- Kompiliert den Typoskript-Code in Javascript.
- Führt die
SetupPackage.jsDatei aus, die das distVerpacken vorbereitet .
- CDs in das
distVerzeichnis und erstellt das Paket dort.
Ich benutze die version.txtDatei als einfache Möglichkeit, die Version in package.json zu erhalten und mein Repo zu markieren. Es gibt unzählige andere Möglichkeiten, dies zu tun, oder Sie möchten die Version automatisch inkrementieren. Entfernen Sie dies aus SetupPackage.tsund .npmignorewenn es für Sie nicht nützlich ist.