จะเผยแพร่แพ็คเกจ 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": {
    ...
  }
}

คำตอบ:


103

ดูที่ฟิลด์ "files" ของไฟล์ package.json https://docs.npmjs.com/files/package.json#files

จากเอกสารประกอบ:

ฟิลด์ "files" คืออาร์เรย์ของไฟล์ที่จะรวมไว้ในโปรเจ็กต์ของคุณ หากคุณตั้งชื่อโฟลเดอร์ในอาร์เรย์โฟลเดอร์นั้นจะรวมไฟล์ไว้ในโฟลเดอร์นั้นด้วย (เว้นแต่จะถูกละเลยโดยกฎอื่น)


3
ฉันอยากทราบว่าช่อง "ไฟล์" ลบล้าง.gitignoreหรือ.npmignore(ดูเหมือนว่าจะไม่เป็นไปตามที่ฉันอ่านเอกสาร) - @Naresh โปรดบอกเราว่าวิธีใดใช้ได้ผลดี
topheman

8
"files" กำลังละเว้น. gitignore ฉันมี "dist" ใน. gitignore ของฉัน แต่รวมอยู่ใน "ไฟล์" และโฟลเดอร์กำลังเผยแพร่ไปยัง npm "files" ดูเหมือนว่าแพ็กเกจยอดนิยมต่างๆเช่น expess และ bluebird กำลังเผยแพร่ (ในขณะที่มีแพ็คเกจอื่น ๆ ที่ใช้เมธอด. npmignore) สำหรับตอนนี้ฉันใช้ "ไฟล์" เพราะดูเหมือนว่าจะเป็นวิธีที่ตรงกว่าในการบอกว่าจะเผยแพร่อะไร แต่ต้องขอบคุณทั้งสองท่านที่เพิ่มพูนความรู้เกี่ยวกับ npm อย่างน้อยวันนี้สองครั้ง!
Naresh

3
เป็นที่น่าสังเกตว่าหากระบุ "ไฟล์" แล้วจะมีเพียงไฟล์เหล่านั้นเท่านั้นที่รวมอยู่ในโปรเจ็กต์ของคุณ (นอกเหนือจากไฟล์ที่ไม่สามารถยกเว้นได้เช่น package.json เป็นต้น)
bmacnaughton

176

เมื่อคุณnpm publishไม่มี.npmignoreไฟล์ npm จะใช้.gitignoreไฟล์ของคุณ(ในกรณีของคุณคือคุณยกเว้นdistโฟลเดอร์)

เพื่อแก้ปัญหาของคุณให้สร้าง.npmignoreไฟล์ขึ้นอยู่กับ.gitignoreไฟล์โดยไม่ละเลยโฟลเดอร์อ

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


3
ขอบคุณสำหรับการตอบกลับอย่างรวดเร็ว คำตอบของคุณถูกต้องอย่างแน่นอน แต่ตอนนี้ฉันกำลังดำเนินการตามแนวทาง "ไฟล์" ที่ Eugene แนะนำเพราะดูเหมือนว่าฉันจะตรงกว่า โปรดดูความคิดเห็นโดยละเอียดของฉันภายใต้คำตอบของเขา
Naresh

3
ขอบคุณมาก!
corvid

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 ข้อมูลไฟล์

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

is-installed-globallyแพคเกจแล้วประโยชน์ถ้าคุณต้องการที่จะสร้างเส้นทางเทียบกับไฟล์กระจายขึ้นอยู่กับว่าพวกเขามีการติดตั้งประเทศหรือทั่วโลก: วิธีการที่จะบอกว่าแพคเกจ NPM ถูกติดตั้งทั่วโลกหรือท้องถิ่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.