Як опублікувати пакет 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": {
    ...
  }
}

Відповіді:


102

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

З документації:

Поле "файли" - це масив файлів, який потрібно включити у ваш проект. Якщо ви назвали папку в масиві, вона також буде містити файли всередині цієї папки. (Якщо вони не будуть ігноровані іншим правилом.)


3
Мені цікаво дізнатися, чи перекриває поле "файли" .gitignoreабо .npmignore(здається, це не так, як я читаю документ) - @Naresh, будь ласка, скажіть нам, який спосіб спрацював добре.
topheman

8
"Файли" дійсно ігнорує .gitignore. У мене є "dist" у своєму .gitignore, але включений у "файли", і папка публікується до npm. "Файли", схоже, публікують декілька популярних пакетів, таких як expess та bluebird (хоча є й інші пакунки, які використовують метод .npmignore). Поки що я йду з "файлами", тому що, здається, це більш прямий спосіб сказати, що публікувати. Але дякую вам обом за те, що сьогодні ви збільшили мої знання про npm!
Нареш

3
Варто зазначити, що якщо "файли" вказані, то лише ті файли є єдиними, які включені у ваш проект (крім файлів, які неможливо виключити, як package.json тощо)
bmacnaughton,

176

Коли у вас npm publish, якщо у вас немає .npmignoreфайлу, npm використовуватиме ваш .gitignoreфайл (у вашому випадку ви виключили distпапку).

Щоб вирішити свою проблему, створіть на .npmignoreоснові .gitignoreфайлу файл, не ігноруючи папку dist .

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


3
дякую за швидку відповідь. Ваша відповідь, безумовно, правильна, але наразі я йду з підходом "файлів", запропонованим Євгенієм, як мені здається більш прямим. Будь ласка, дивіться мій детальний коментар під його відповіддю.
Нареш

3
Дуже дякую!
коровай

0

Мінімальний приклад використання файлів даних зі скрипту

Інший поширений випадок використання - це файли даних, які повинні використовувати ваші сценарії.

Це можна зробити легко, використовуючи методи, згадані в: У node.JS, як я можу отримати шлях модуля, який я завантажив через вимагає, що це * не * мій (тобто в деякому 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-data-files

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

Потім is-installed-globallyпакет корисний, якщо ви хочете генерувати відносні шляхи до розподілених файлів залежно від того, чи встановлені вони локально чи глобально: Як визначити, чи встановлено пакет npm глобально чи локально

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.