Comment publier un package npm avec des fichiers de distribution?

126

Je souhaite publier un package npm contenant ma source ainsi que les fichiers de distribution. Mon référentiel Github contient un srcdossier contenant les fichiers source JavaScript. Le processus de génération génère un distdossier contenant les fichiers de distribution. Bien sûr, le distdossier n'est pas archivé dans le référentiel Github.

Comment publier un package npm de manière à ce que lorsque quelqu'un le fasse npm install, il obtienne srcainsi qu'un distdossier? Actuellement, lorsque j'exécute à npm publishpartir de mon référentiel git, seul le srcdossier est publié.

Mon package.json ressemble à ceci:

{
  "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
la source

Réponses:

102

Jetez un œil au champ "files" du fichier package.json https://docs.npmjs.com/files/package.json#files

De la documentation:

Le champ "fichiers" est un tableau de fichiers à inclure dans votre projet. Si vous nommez un dossier dans le tableau, il inclura également les fichiers à l'intérieur de ce dossier. (À moins qu'ils ne soient ignorés par une autre règle.)

Eugène Nezhuta
la source
3
Je suis curieux de savoir si le champ "fichiers" remplace .gitignoreou .npmignore(il semble que ce ne soit pas le cas comme j'ai lu la doc) - @Naresh s'il vous plaît nous dire de quelle manière a fonctionné correctement.
topheman
8
"files" ignore en effet .gitignore. J'ai "dist" dans mon .gitignore, mais inclus dans "files" et le dossier est publié sur npm. «fichiers» semble être la façon dont plusieurs paquets populaires comme expess et bluebird publient (alors qu'il existe d'autres paquets qui utilisent la méthode .npmignore). Pour l'instant, j'utilise les "fichiers" car cela semble être une manière plus directe de dire ce qu'il faut publier. Mais merci à vous deux d'avoir augmenté mes connaissances sur npm au moins deux fois aujourd'hui!
Naresh le
3
Il convient de noter que si "files" est spécifié, seuls ces fichiers sont les seuls à être inclus dans votre projet (autres que les fichiers ne pouvant pas être exclus comme package.json, etc.)
bmacnaughton
176

Lorsque vous npm publish, si vous n'avez pas de .npmignorefichier, npm utilisera votre .gitignorefichier (dans votre cas, vous avez exclu le distdossier).

Pour résoudre votre problème, créez un .npmignorefichier basé sur votre .gitignorefichier, sans ignorer le dossier dist .

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

topheman
la source
3
merci pour votre réponse rapide. Votre réponse est certes correcte, mais pour l'instant je vais avec l'approche "fichiers" suggérée par Eugene car elle me semble plus directe. S'il vous plaît voir mon commentaire détaillé sous sa réponse.
Naresh
3
Merci beaucoup!
corvid
0

Exemple minimal d'utilisation des fichiers de données à partir d'un script

Un autre cas d'utilisation courant est d'avoir des fichiers de données que vos scripts doivent utiliser.

Cela peut être fait facilement en utilisant les techniques mentionnées à: Dans node.JS comment puis-je obtenir le chemin d'un module que j'ai chargé via require qui n'est * pas * le mien (c'est-à-dire dans certains node_module)

L'exemple complet peut être trouvé à:

Avec cette configuration, le fichier mydata.txtest placé node_modules/cirosantilli-data-files/mydata.txtaprès l'installation car nous l'avons ajouté à notre files:entrée de package.json.

Notre fonction myfuncpeut ensuite trouver ce fichier et utiliser son contenu en utilisant require.resolve. Cela fonctionne également uniquement sur l'exécutable, ./cirosantilli-data-filesbien sûr.

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());

Le is-installed-globallypackage est alors utile si vous souhaitez générer des chemins relatifs vers les fichiers distribués selon qu'ils sont installés localement ou globalement: Comment savoir si le package npm a été installé globalement ou localement

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