Bagaimana cara mempublikasikan paket npm dengan file distribusi?

125

Saya ingin menerbitkan paket npm yang berisi file sumber dan distribusi saya. Repositori Github saya berisi srcfolder yang berisi file sumber JavaScript. Proses membangun menghasilkan distfolder yang berisi file distribusi. Tentu saja, distfolder tersebut tidak diperiksa di repositori Github.

Bagaimana cara saya mempublikasikan paket npm sedemikian rupa sehingga ketika seseorang melakukannya npm install, mereka mendapatkan srcserta distfolder? Saat ini ketika saya menjalankan npm publishdari repositori git saya, itu hanya menghasilkan srcfolder yang diterbitkan.

Package.json saya terlihat seperti ini:

{
  "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
sumber

Jawaban:

102

Lihat bidang "files" dari file package.json https://docs.npmjs.com/files/package.json#files

Dari dokumentasi:

Bidang "file" adalah larik file untuk disertakan dalam proyek Anda. Jika Anda memberi nama folder dalam array, maka itu juga akan menyertakan file di dalam folder itu. (Kecuali mereka akan diabaikan oleh aturan lain.)

Eugene Nezhuta
sumber
3
Saya ingin tahu apakah bidang "file" menimpa .gitignoreatau .npmignore(sepertinya tidak seperti saat saya membaca dokumen) - @Naresh beri tahu kami cara mana yang berfungsi dengan baik.
topheman
8
"files" memang mengabaikan .gitignore. Saya memiliki "dist" di .gitignore saya, tetapi disertakan dalam "file" dan folder sedang dipublikasikan ke npm. "files" tampaknya menjadi cara penerbitan beberapa paket populer seperti expess dan bluebird (sementara ada paket lain yang menggunakan metode .npmignore). Untuk saat ini, saya menggunakan "file" karena ini tampaknya merupakan cara yang lebih langsung untuk mengatakan apa yang harus dipublikasikan. Tapi terima kasih kepada kalian berdua karena telah meningkatkan pengetahuan saya tentang npm setidaknya dua kali hari ini!
Naresh
3
Perlu dicatat bahwa jika "file" ditentukan maka hanya file-file itu yang termasuk dalam proyek Anda (selain file yang tidak dapat dikecualikan seperti package.json, dll.)
bmacnaughton
176

Ketika Anda npm publish, jika Anda tidak memiliki .npmignorefile, npm akan menggunakan .gitignorefile Anda (dalam kasus Anda Anda mengecualikan distfolder tersebut).

Untuk mengatasi masalah Anda, buat .npmignorefile berdasarkan .gitignorefile Anda , tanpa mengabaikan folder dist .

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

topheman
sumber
3
terima kasih atas tanggapan Anda yang cepat. Tanggapan Anda pasti benar, tetapi untuk saat ini saya akan menggunakan pendekatan "file" yang disarankan oleh Eugene karena menurut saya lebih langsung. Silakan lihat komentar rinci saya di bawah tanggapannya.
Naresh
3
Terima kasih banyak!
Corvid
0

Contoh minimal bagaimana menggunakan file data dari sebuah script

Kasus penggunaan umum lainnya adalah memiliki file data yang perlu digunakan skrip Anda.

Ini dapat dilakukan dengan mudah dengan menggunakan teknik yang disebutkan di: Dalam node.JS bagaimana saya bisa mendapatkan jalur modul yang telah saya muat melalui require yang * bukan * milik saya (yaitu di beberapa node_module)

Contoh lengkapnya dapat ditemukan di:

Dengan pengaturan ini, file mydata.txtdimasukkan ke dalam node_modules/cirosantilli-data-files/mydata.txtsetelah instalasi karena kami menambahkannya ke files:entri kami package.json.

Fungsi kami myfunckemudian dapat menemukan file itu dan menggunakan isinya dengan menggunakan require.resolve. Ini juga hanya berfungsi pada eksekusi ./cirosantilli-data-filestentu saja.

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

The is-installed-globallypaket kemudian berguna jika Anda ingin menghasilkan path relatif ke file didistribusikan tergantung jika mereka diinstal secara lokal atau global: Bagaimana untuk mengetahui apakah paket NPM dipasang secara global atau lokal

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