Ich habe ein Projekt, das eine Schluckaufgabe zum Erstellen und Packen der Quellen und zur Veröffentlichung in einem Verzeichnis namens enthält dist
. Mein Ziel ist es, es als npm-Paket zu veröffentlichen, aber nur meinen dist-Ordner. Die npm-Dokumentation besagt, dass ich das files
Tag verwenden kann, um zu exportierende Dateien anzugeben. Es klappt. In der Dokumentation heißt es aber auch:
Wenn Sie einen Ordner im Array benennen, enthält er auch die Dateien in diesem Ordner
Das Ergebnis ist ein npm-Paket, das wie node_modules aussieht:
Aber ich möchte alle meine Dateien im Stammverzeichnis des Pakets sehen (ohne diesen dist
Ordner). Meine index.js
Datei befindet sich im dist
Ordner, sollte sich aber im Stammverzeichnis befinden. Ich habe versucht, das Tag files
als festzulegen , /dist/**/*
aber es hat nicht funktioniert.
Wie kann ich das erreichen?
quelle
npm pack
die Datei package.jsonfiles
und diemain
Felder und.npmignore
geben einem Entwickler alles, was zum Erstellen eines Pakets aus einem bestimmten installierbaren Verzeichnis erforderlich ist.Ich habe ein ähnliches Problem wie das Originalposter (@robsonrosa). In meinem Fall verwende ich typecript, das in ein
dist
Verzeichnis kompiliert wird . Obwohl ich Typoskript in das Stammverzeichnis kompilieren lassen könnte, denke ich, dass die beste Lösung darin besteht, eine separatepackage.json
Datei im dist-Verzeichnis zu generieren .Dies ähnelt dem Vorschlag von @scvnc, das zu kopieren,
package.json
jedoch mit einer Wendung:Als Teil des Verpackungsprozesses sollten Sie eine
package.json
für das Paket generieren , die auf der Hauptdateipackage.json
im Stammverzeichnis basiert, sich jedoch von dieser unterscheidetDas Grundprinzip:
package.json
ist 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 entferntpackage.json
.--- 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:
Ich möchte nur das
dist
Verzeichnis verpacken und das Verzeichnis sollte das Stammverzeichnis im Paket sein.Die Datei
SetupPackage.ts
in meinemsrc
Verzeichnis wird per TyposkriptSetupPackage.js
in dasdist
Verzeichnis kompiliert :Diese Datei:
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.package.json
in eine aufgerufene Dateiversion.txt
..npmignore
Paket aus dem Stammverzeichnis.Der .npmignore-Inhalt lautet:
Dh Unit-Tests (Spezifikationsdateien) und Typoskript-Map-Dateien werden ebenso ignoriert wie die
SetupPackage.js
Datei und dieversion.txt
Datei, die sie erstellt. Dies hinterlässt ein sauberes Paket.Schließlich enthält die Hauptdatei
package.json
die folgenden Skripts zur Verwendung durch das Build-System (vorausgesetzt, siesh
wird als Shell verwendet).Um das Paket zu erstellen, klont das Build-System das Repo, führt es aus
npm install
und führt es dann aus,npm run buildpackage
was wiederum:dist
Verzeichnis, um eine saubere Kompilierung zu gewährleisten.SetupPackage.js
Datei aus, die dasdist
Verpacken vorbereitet .dist
Verzeichnis und erstellt das Paket dort.Ich benutze die
version.txt
Datei 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 ausSetupPackage.ts
und.npmignore
wenn es für Sie nicht nützlich ist.quelle
Wenn Ihr Projekt Git hat, können Sie einen kleinen Hack verwenden. Fügen Sie die nächsten Skripte zu package.json hinzu
jetzt, wenn Sie den
publish
Befehl npm ausführen, einbeziehenprepublishOnly
. Es erstellt Dateien und speichert sie in einemlib
Ordner (ein Build-Skript hängt von Ihrem Projekt ab). Der nächste Befehl kopiert Dateien in den Stammordner und entfernt sielib
. Nach dem Veröffentlichen despostpublish
Skripts wird das Projekt auf einen vorherigen Status zurückgesetzt.quelle
Ich empfehle Ihnen dringend
.npmignore
, Dinge zu verwenden, anstatt sie zu verschieben oder zu kopieren, insbesondere wenn Sie ein CI für Bereitstellungen verwenden, und dort einfach die Dateien hinzuzufügen, die Sie nicht veröffentlichen möchten.https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package
Beispiel:
Aktualisieren:
Wenn Sie Ihren Code mit demselben Repo in verschiedene npm-Pakete aufteilen möchten, bin ich kürzlich auf dieses Projekt gestoßen: Lerna und sieht wirklich gut aus.
Vielleicht solltest du einen Blick darauf werfen
quelle
require('mypackage/foo')
anstattrequire('mypackage/dist/foo')
Das funktioniert gut für mich.
cd TMPDIR;
npm pack
/path/to/package.jsonTarball wird im TMPDIR-Verzeichnis erstellt.
quelle
npm pack
Außerdem funktioniert dasfiles
Feld package.json (oder.npmignore
) wunderbar.Sie müssen den
dist
Ordner veröffentlichenDer natürliche Weg, dies zu erreichen, besteht nach dem npm-Ansatz darin, den Ordner zu veröffentlichen, der das Stammverzeichnis sein soll. Es gibt verschiedene Möglichkeiten, dies zu tun, abhängig von der endgültigen Umgebung, mit der Sie arbeiten möchten:
npm publish dist
.npm install relative/path/to/dist
node_modules
in einem anderen Projekt, falls Sie möchten, dass die Änderungen in Ihrem Originalpaket sofort in einem anderen Projekt übernommen werden. In Ihrem Fall führen Sie zuerstcd dist
ausnpm link
und gehen dann zum anderen Projekt und führen es ausnpm link robsonrosa-ui-alert
.Voraussetzung : In jedem Fall müssen Sie vor dem Veröffentlichen / Installieren / Verknüpfen
dist
mindestens eine ordnungsgemäßepackage.json
Datei in Ihren Ordner einfügen . In Ihrem Fall muss der Paketname in Ihrer Datei package.json als definiert sein"name": "robsonrosa-ui-alert"
. Normalerweise möchten Sie dort auch einige andere Dateien wie README.md oder LICENSE.Automatisierungsbeispiel
Sie können den Veröffentlichungsprozess mithilfe des
prepare
Skripts in Kombination mit dembuild
Skript automatisieren . Darüber hinaus können Sie Ihr Paket vor einer versehentlichen Veröffentlichung des Paketstammordners schützen. Das"private": true
Feld befindet sich in der Datei package.json im Stammverzeichnis Ihres Paketrepos. Hier ist ein Beispiel:"private": true, "scripts": { "build": "rm -rf dist && gulp build && cat ./package.json | grep -v '\"private\":' > dist/package.json", "prepare": "npm run build" },
Auf diese Weise veröffentlichen Sie den Stammordner nicht und erhalten das Paket erstellt und package.json wird während
dist
des Veröffentlichungsprozesses automatisch in den Ordner kopiert .quelle
Option 1: Navigieren Sie zum Ordner und führen Sie "npm Publish" aus. Befehl
Option 2: Führen Sie npm Publish / Path / Directory aus
quelle
Hier ist noch ein Ansatz, den ich für den saubersten halte. Es ist alles konfigurationsbasiert, ohne dass Dateien verschoben oder Pfade in den Build- und Pack-Skripten angegeben werden müssen:
package.json
Geben Sie die Hauptdatei an.Einige zusätzliche Typoskriptoptionen:
rootDir
. Dieses Verzeichnis enthält den gesamten Quellcode und sollte eineindex
Datei enthalten (oder eine andere Datei, die Sie als Hauptdatei in der verwenden könnenpackage.json
).outDir
. Hier wird Ihr tsc-Befehl erstellttsconfig.json
quelle
Erstellen Sie einfach eine
.npmignore
Datei und fügen Sie Folgendes hinzu:quelle