Como publicar um pacote npm com arquivos de distribuição?


125

Eu gostaria de publicar um pacote npm que contém meus arquivos de origem e de distribuição. Meu repositório Github contém uma srcpasta que contém arquivos de origem JavaScript. O processo de construção gera uma distpasta que contém os arquivos de distribuição. Claro, a distpasta não é registrada no repositório Github.

Como faço para publicar um pacote npm de uma forma que quando alguém faz npm install, que recebem src, bem como distpasta? Atualmente, quando executo a npm publishpartir do meu repositório git, resulta na srcpublicação de apenas uma pasta.

Meu package.json se parece com isto:

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

Respostas:


102

Dê uma olhada no campo "arquivos" do arquivo package.json https://docs.npmjs.com/files/package.json#files

Da documentação:

O campo "arquivos" é um conjunto de arquivos a serem incluídos em seu projeto. Se você nomear uma pasta na matriz, ela também incluirá os arquivos dentro dessa pasta. (A menos que sejam ignorados por outra regra.)


3
Estou curioso para saber se o campo "arquivos" se sobrepõe .gitignoreou .npmignore(parece que não, conforme li o documento) - @Naresh, por favor, diga-nos como funcionou bem.
— topheman

8
"arquivos" na verdade está ignorando .gitignore. Tenho "dist" em meu .gitignore, mas incluído em "arquivos" e a pasta está sendo publicada no npm. "arquivos" parece ser como vários pacotes populares como expess e bluebird estão sendo publicados (embora existam outros pacotes que usam o método .npmignore). Por enquanto, vou com "arquivos" porque parece ser uma forma mais direta de dizer o que publicar. Mas obrigado a vocês dois por aumentar meu conhecimento sobre NPM pelo menos duas vezes hoje!
— Naresh

3
É importante notar que se "arquivos" for especificado, então apenas esses arquivos serão os únicos incluídos em seu projeto (exceto os arquivos que não podem ser excluídos como package.json, etc.)
— bmacnaughton

176

Quando você npm publish, se não tiver um .npmignorearquivo, o npm usará seu .gitignorearquivo (no seu caso, você excluiu a distpasta).

Para resolver seu problema, crie um .npmignorearquivo baseado em seu .gitignorearquivo, sem ignorar a pasta dist .

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


3
obrigado por sua resposta rápida. Sua resposta certamente está correta, mas por enquanto vou com a abordagem de "arquivos" sugerida por Eugene, pois me parece mais direta. Por favor, veja meu comentário detalhado em sua resposta.
— Naresh

3
Muito obrigado!
— corvid

0

Exemplo mínimo de como usar arquivos de dados de um script

Outro caso de uso comum é ter arquivos de dados que seus scripts precisam usar.

Isso pode ser feito facilmente usando as técnicas mencionadas em: Em node.JS, como posso obter o caminho de um módulo que carreguei por meio de require que * não * é meu (ou seja, em algum node_module)

O exemplo completo pode ser encontrado em:

Com esta configuração, o arquivo mydata.txté colocado node_modules/cirosantilli-data-files/mydata.txtapós a instalação porque o adicionamos à nossa files:entrada de package.json.

Nossa função myfuncpode então encontrar esse arquivo e usar seu conteúdo usando require.resolve. Ele também funciona apenas no executável, é ./cirosantilli-data-filesclaro.

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

O is-installed-globallypacote é útil se você deseja gerar caminhos relativos para os arquivos distribuídos, dependendo se eles estão instalados localmente ou globalmente: Como saber se o pacote npm foi instalado global ou localmente

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.