Wie veröffentliche ich ein npm-Paket mit Verteilungsdateien?

125

Ich möchte ein npm-Paket veröffentlichen, das meine Quell- und Verteilungsdateien enthält. Mein Github-Repository enthält einen srcOrdner, der JavaScript-Quelldateien enthält. Der Erstellungsprozess generiert einen distOrdner, der die Verteilungsdateien enthält. Natürlich wird der distOrdner nicht in das Github-Repository eingecheckt.

Wie veröffentliche ich ein npm-Paket so, dass jemand, der dies tut npm install, sowohl einen Ordner srcals auch einen distOrdner erhält ? Wenn ich derzeit npm publishvon meinem Git-Repository aus starte, wird nur ein srcOrdner veröffentlicht.

Meine package.json sieht folgendermaßen aus:

{
  "name": "join-js",
  "version": "0.0.1",
  "homepage": "https://github.com/archfirst/joinjs",
  "repository": {
    "type": "git",
    "url": "https://github.com/archfirst/joinjs.git"
  },
  "main": "dist/index.js",
  "scripts": {
    "test": "gulp",
    "build": "gulp build",
    "prepublish": "npm run build"
  },
  "dependencies": {
    ...
  },
  "devDependencies": {
    ...
  }
}
Naresh
quelle

Antworten:

101

Schauen Sie sich das Feld "files" der Datei package.json https://docs.npmjs.com/files/package.json#files an

Aus der Dokumentation:

Das Feld "Dateien" ist ein Array von Dateien, die in Ihr Projekt aufgenommen werden sollen. Wenn Sie einen Ordner im Array benennen, enthält er auch die Dateien in diesem Ordner. (Es sei denn, sie würden von einer anderen Regel ignoriert.)

Eugene Nezhuta
quelle
3
Ich bin gespannt, ob das Feld "Dateien" überschrieben wird .gitignoreoder .npmignore(anscheinend beim Lesen des Dokuments nicht) - @Naresh, bitte sagen Sie uns, welcher Weg gut funktioniert hat.
Topheman
8
"files" ignoriert tatsächlich .gitignore. Ich habe "dist" in meinem .gitignore, bin aber in "files" enthalten und der Ordner wird in npm veröffentlicht. "files" scheint zu sein, wie mehrere beliebte Pakete wie expess und bluebird veröffentlicht werden (während es andere Pakete gibt, die die .npmignore-Methode verwenden). Im Moment gehe ich mit "Dateien", weil es eine direktere Art zu sagen scheint, was zu veröffentlichen ist. Aber danke an euch beide, dass ihr mein Wissen über npm heute mindestens zweimal erweitert habt!
Naresh
3
Es ist erwähnenswert, dass, wenn "Dateien" angegeben sind, nur diese Dateien in Ihrem Projekt enthalten sind (außer den nicht ausschließbaren Dateien wie package.json usw.)
bmacnaughton
174

Wenn Sie npm publishkeine .npmignoreDatei haben, verwendet npm Ihre .gitignoreDatei (in Ihrem Fall haben Sie die ausgeschlossendist Ordner ).

Um Ihr Problem zu lösen, erstellen Sie eine .npmignoreDatei basierend auf Ihrer .gitignoreDatei, ohne den dist-Ordner zu ignorieren .

Quelle: https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package

topheman
quelle
3
Vielen Dank für Ihre schnelle Antwort. Ihre Antwort ist sicherlich richtig, aber im Moment gehe ich mit dem von Eugene vorgeschlagenen "Dateien" -Ansatz vor, da er mir direkter erscheint. Bitte beachten Sie meinen ausführlichen Kommentar unter seiner Antwort.
Naresh
3
Ich danke dir sehr!
Corvid
0

Minimales Beispiel für die Verwendung von Datendateien aus einem Skript

Ein weiterer häufiger Anwendungsfall sind Datendateien, die Ihre Skripte verwenden müssen.

Dies kann einfach mithilfe der unter: In node.JS genannten Techniken erfolgen. Wie kann ich den Pfad eines Moduls ermitteln, über das ich geladen habe? Dies ist * nicht * mein (dh in einigen node_module).

Das vollständige Beispiel finden Sie unter:

Bei diesem Setup wird die Datei nach der Installation mydata.txtabgelegt, node_modules/cirosantilli-data-files/mydata.txtda wir sie unserem files:Eintrag von hinzugefügt haben package.json.

Unsere Funktion myfunckann diese Datei dann finden und ihren Inhalt mithilfe von verwenden require.resolve. Es funktioniert ./cirosantilli-data-filesnatürlich auch nur auf der ausführbaren Datei .

package.json

{
  "bin": {
    "cirosantilli-data-files": "cirosantilli-data-files"
  },
  "license": "MIT",
  "files":  [
    "cirosantilli-data-files",
    "mydata.txt",
    "index.js"
  ],
  "name": "cirosantilli-data-files",
  "repository": "cirosantilli/linux-kernel-module-cheat",
  "version": "0.1.0"
}

mydata.txt

hello world

index.js

const fs = require('fs');
const path = require('path');

function myfunc() {
  const package_path = path.dirname(require.resolve(
    path.join('cirosantilli-data-files', 'package.json')));
  return fs.readFileSync(path.join(package_path, 'mydata.txt'), 'utf-8');
}
exports.myfunc = myfunc;

Cirosantilli-Datendateien

#!/usr/bin/env node
const cirosantilli_data_files = require('cirosantilli-data-files');
console.log(cirosantilli_data_files.myfunc());

Das is-installed-globallyPaket ist dann nützlich, wenn Sie relative Pfade zu den verteilten Dateien generieren möchten, je nachdem, ob sie lokal oder global installiert sind: So stellen Sie fest, ob das npm-Paket global oder lokal installiert wurde

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle