Как опубликовать пакет npm с файлами дистрибутива?

126

Я хотел бы опубликовать пакет npm, содержащий мой исходный код, а также файлы распространения. Мой репозиторий Github содержит srcпапку, содержащую исходные файлы JavaScript. В процессе сборки создается distпапка, содержащая файлы распространения. Конечно, distпапка не проверяется в репозитории Github.

Как мне опубликовать пакет npm таким образом, чтобы, когда кто-то это сделал npm install, они получили не srcхуже distпапки? В настоящее время, когда я запускаю npm publishсвой репозиторий git, srcпубликуется только папка.

Мой package.json выглядит так:

{
  "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
источник

Ответы:

103

Взгляните на поле "files" файла package.json https://docs.npmjs.com/files/package.json#files.

Из документации:

Поле «files» - это массив файлов, которые нужно включить в ваш проект. Если вы дадите имя папке в массиве, она также будет включать файлы внутри этой папки. (Если только они не будут проигнорированы другим правилом.)

Евгений Нежута
источник
3
Мне любопытно узнать, отменяет .gitignoreли поле «файлы» или .npmignore(похоже, что это не так, когда я читал документ) - @Naresh, пожалуйста, скажите нам, какой способ работал нормально.
topheman
8
"files" действительно игнорирует .gitignore. У меня есть "dist" в моем .gitignore, но он включен в "files", и папка публикуется в npm. Похоже, что «файлы» - это то, как публикуются несколько популярных пакетов, таких как expess и bluebird (в то время как есть другие пакеты, которые используют метод .npmignore). На данный момент я использую «файлы», потому что это кажется более прямым способом сказать, что публиковать. Но спасибо вам обоим за то, что сегодня я как минимум вдвое увеличил мои знания о npm!
Naresh
3
Стоит отметить, что если указано «files» , то в ваш проект будут включены только эти файлы ( кроме файлов, которые нельзя исключить, таких как package.json и т. Д.)
bmacnaughton
176

Когда у вас npm publish, если у вас нет .npmignoreфайла, npm будет использовать ваш .gitignoreфайл (в вашем случае вы исключили distпапку).

Чтобы решить вашу проблему, создайте .npmignoreфайл на основе вашего .gitignoreфайла, не игнорируя папку dist .

Источник: https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package

topheman
источник
3
спасибо за быстрый ответ. Ваш ответ, безусловно, правильный, но пока я придерживаюсь "файлового" подхода, предложенного Юджином, поскольку он мне кажется более прямым. См. Мой подробный комментарий под его ответом.
Naresh
3
Спасибо вам большое!
Corvid 02
0

Минимальный пример того, как использовать файлы данных из скрипта

Другой распространенный вариант использования - это файлы данных, которые должны использоваться вашими скриптами.

Это можно легко сделать, используя методы, упомянутые в: В node.JS, как я могу получить путь к модулю, который я загрузил с помощью require, который * не * мой (т.е. в каком-то node_module)

Полный пример можно найти по адресу:

При такой настройке файл mydata.txtпомещается node_modules/cirosantilli-data-files/mydata.txtпосле установки, потому что мы добавили его в нашу files:запись package.json.

myfuncЗатем наша функция может найти этот файл и использовать его содержимое с помощью require.resolve. Конечно, он также работает только с исполняемым файлом ./cirosantilli-data-files.

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-данные-файлы

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

Затем is-installed-globallyпакет полезен, если вы хотите сгенерировать относительные пути к распределенным файлам в зависимости от того, установлены ли они локально или глобально: Как узнать, был ли пакет npm установлен глобально или локально

Чиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
источник