Come pubblicare un pacchetto npm con i file di distribuzione?


126

Vorrei pubblicare un pacchetto npm che contiene i miei file sorgente e di distribuzione. Il mio repository Github contiene una srccartella che contiene i file di origine JavaScript. Il processo di compilazione generadist cartella che contiene i file di distribuzione. Ovviamente, la distcartella non viene archiviata nel repository Github.

Come faccio a pubblicare un pacchetto npm in modo che quando qualcuno lo fa npm install, ottenga srcanche la distcartella? Attualmente, quando eseguo npm publishdal mio repository git, srcviene pubblicata solo la cartella.

Il mio package.json ha questo aspetto:

{
  "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": {
    ...
  }
}

Risposte:


102

Dai un'occhiata al campo "files" del file package.json https://docs.npmjs.com/files/package.json#files

Dalla documentazione:

Il campo "file" è un array di file da includere nel progetto. Se assegni un nome a una cartella nell'array, includerà anche i file all'interno di quella cartella. (A meno che non vengano ignorati da un'altra regola.)


3
Sono curioso di sapere se il campo "files" ha la precedenza .gitignoreo .npmignore(sembra che non sia così mentre leggo il documento) - @Naresh per favore dicci in che modo ha funzionato bene.
topheman

8
"files" in effetti sta ignorando .gitignore. Ho "dist" nel mio .gitignore, ma incluso in "files" e la cartella è in fase di pubblicazione su npm. "files" sembra essere il modo in cui vengono pubblicati diversi pacchetti popolari come expess e bluebird (mentre ci sono altri pacchetti che usano il metodo .npmignore). Per ora, vado con "file" perché sembra essere un modo più diretto per dire cosa pubblicare. Ma grazie a entrambi per aver aumentato la mia conoscenza di npm almeno di due volte oggi!
Naresh

3
Vale la pena notare che se "file" è specificato, solo quei file sono gli unici che sono inclusi nel tuo progetto (a parte i file non possono essere esclusi come package.json, ecc.)
bmacnaughton

176

Quando tu npm publish, se non hai un .npmignorefile, npm userà il tuo .gitignorefile (nel tuo caso hai escluso la distcartella).

Per risolvere il tuo problema, crea un .npmignorefile basato sul tuo .gitignorefile, senza ignorare la cartella dist .

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


3
grazie per la tua rapida risposta. La tua risposta è certamente corretta, ma per ora vado con l'approccio "file" suggerito da Eugene poiché mi sembra più diretto. Si prega di vedere il mio commento dettagliato sotto la sua risposta.
Naresh

3
Grazie mille!
corvid

0

Esempio minimo di come utilizzare i file di dati da uno script

Un altro caso d'uso comune è disporre di file di dati che devono essere utilizzati dagli script.

Questo può essere fatto facilmente utilizzando le tecniche menzionate in: In node.JS come posso ottenere il percorso di un modulo che ho caricato tramite require che * non * è mio (cioè in alcuni node_module)

L'esempio completo può essere trovato su:

Con questa configurazione, il file mydata.txtviene inserito node_modules/cirosantilli-data-files/mydata.txtdopo l'installazione perché lo abbiamo aggiunto alla nostra files:voce di package.json.

La nostra funzione myfuncpuò quindi trovare quel file e utilizzarne il contenuto utilizzando require.resolve. ./cirosantilli-data-filesOvviamente funziona anche sull'eseguibile .

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-data-files

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

Il is-installed-globallypacchetto è quindi utile se si desidera generare percorsi relativi ai file distribuiti a seconda che siano installati localmente o globalmente: Come sapere se il pacchetto npm è stato installato globalmente o localmente

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.