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

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

Eugene Nezhuta
fonte
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

Topheman
fonte
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

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