¿Cómo publicar un paquete npm con archivos de distribución?

126

Me gustaría publicar un paquete npm que contenga mi fuente y archivos de distribución. Mi repositorio de Github contiene una srccarpeta que contiene archivos fuente JavaScript. El proceso de construcción genera una distcarpeta que contiene los archivos de distribución. Por supuesto, la distcarpeta no está registrada en el repositorio de Github.

¿Cómo publico un paquete npm de manera que cuando alguien lo haga npm install, reciba srctan bien como distcarpeta? Actualmente, cuando ejecuto npm publishdesde mi repositorio de git, solo srcse publica la carpeta.

Mi package.json se ve así:

{
  "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
fuente

Respuestas:

102

Eche un vistazo al campo "archivos" del archivo package.json https://docs.npmjs.com/files/package.json#files

De la documentación:

El campo "archivos" es una matriz de archivos para incluir en su proyecto. Si nombra una carpeta en la matriz, también incluirá los archivos dentro de esa carpeta. (A menos que sean ignorados por otra regla).

Eugene Nezhuta
fuente
3
Tengo curiosidad por saber si el campo "archivos" anula .gitignoreo .npmignore(parece que no lo hace cuando leo el documento) - @Naresh, por favor díganos de qué manera funcionó bien.
topheman
8
"archivos" de hecho está ignorando .gitignore. Tengo "dist" en mi .gitignore, pero se incluye en "archivos" y la carpeta se publica en npm. "archivos" parece ser la forma en que se publican varios paquetes populares como expess y bluebird (mientras que hay otros paquetes que utilizan el método .npmignore). Por ahora, voy con "archivos" porque parece ser una forma más directa de decir qué publicar. ¡Pero gracias a los dos por aumentar mi conocimiento sobre npm al menos dos veces hoy!
Naresh
3
Vale la pena señalar que si se especifican "archivos", entonces solo esos archivos son los únicos que están incluidos en su proyecto (aparte de los archivos que no se pueden excluir como package.json, etc.)
bmacnaughton
176

Cuando usted npm publish, si no tiene un .npmignorearchivo, npm usará su .gitignorearchivo (en su caso, excluyó la distcarpeta).

Para resolver su problema, cree un .npmignorearchivo basado en su .gitignorearchivo, sin ignorar la carpeta dist .

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

topheman
fuente
3
gracias por su rápida respuesta. Su respuesta es ciertamente correcta, pero por ahora voy con el enfoque de "archivos" sugerido por Eugene, ya que me parece más directo. Vea mi comentario detallado debajo de su respuesta.
Naresh
3
Muchas gracias!
corvid
0

Ejemplo mínimo de cómo usar archivos de datos de un script

Otro caso de uso común es tener archivos de datos que sus scripts deben usar.

Esto se puede hacer fácilmente usando las técnicas mencionadas en: En node.JS, ¿cómo puedo obtener la ruta de un módulo que he cargado a través de require que es * no * mío (es decir, en algún node_module)

El ejemplo completo se puede encontrar en:

Con esta configuración, el archivo mydata.txtse coloca node_modules/cirosantilli-data-files/mydata.txtdespués de la instalación porque lo agregamos a nuestra files:entrada de package.json.

Nuestra función myfuncpuede entonces encontrar ese archivo y usar su contenido usando require.resolve. También solo funciona en el ejecutable, ./cirosantilli-data-filespor supuesto.

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

El is-installed-globallypaquete es útil si desea generar rutas relativas a los archivos distribuidos dependiendo de si están instalados localmente o globalmente: Cómo saber si el paquete npm se instaló global o localmente

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