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

4 minutos de lectura

avatar de usuario
Naresh

Me gustaría publicar un paquete npm que contenga mi código fuente y archivos de distribución. Mi repositorio de GitHub contiene src carpeta que contiene los archivos fuente de JavaScript. El proceso de construcción genera dist carpeta que contiene los archivos de distribución. Por supuesto, el dist la carpeta no está registrada en el repositorio de GitHub.

¿Cómo publico un paquete npm de manera que cuando alguien lo haga npm installconsiguen src tanto como dist ¿carpeta? Actualmente cuando corro npm publish de mi repositorio de Git, da como resultado solo el src carpeta que se está publicando.

Mi paquete.json archivo 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": {
    ...
  }
}

avatar de usuario
superhombre

Cuando usted npm publishsi no tienes .npmignore archivo, npm usará su .gitignore archivo (en su caso excluyó el dist carpeta).

Para resolver su problema, cree un .npmignore archivo basado en su .gitignore expediente, sin ignorar la carpeta dist.

Fuente: Mantener los archivos fuera de su paquete

  • Gracias por tu 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. Por favor vea mi comentario detallado debajo de su respuesta.

    – Naresh

    27 de julio de 2015 a las 2:10

avatar de usuario
Eugene Nezhuta

Eche un vistazo al campo “archivos” del archivo package.json:
paquete.json, archivos

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).

  • Tengo curiosidad por saber si el campo “archivos” anula .gitignore o .npmignore (Parece que no es así cuando leí el documento) – @Naresh, por favor díganos de qué manera funcionó bien.

    – topheman

    26 de julio de 2015 a las 22:41

  • “archivos” de hecho está ignorando .gitignore. Tengo “dist” en mi .gitignore, pero incluido 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 usan 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

    27 de julio de 2015 a las 2:07

  • Vale la pena señalar que si se especifica “archivos”, entonces solamente esos archivos son los únicos que se incluyen en su proyecto (aparte de los archivos que no se pueden excluir como package.json, etc.)

    – bmacnaughton

    5 de septiembre de 2017 a las 15:13

avatar de usuario
Ciro Santilli Путлер Капут 六四事

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 necesitan usar.

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

El ejemplo completo se puede encontrar en:

Con esta configuración, el archivo mydata.txt se pone en node_modules/cirosantilli-data-files/mydata.txt después de la instalación, porque lo agregamos a nuestro files: entrada de package.json.

Nuestra función myfunc luego puede encontrar ese archivo y usar su contenido usando require.resolve. También solo funciona en el ejecutable. ./cirosantilli-data-files por supuesto.

paquete.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"
}

misdatos.txt

hello world

índice.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-archivos-de-datos

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

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

¿Ha sido útil esta solución?