Làm thế nào để xuất bản một gói npm với các tệp phân phối?


125

Tôi muốn xuất bản một gói npm có chứa nguồn của tôi cũng như các tệp phân phối. Kho lưu trữ Github của tôi chứa srcthư mục chứa các tệp nguồn JavaScript. Quá trình xây dựng tạo ra distthư mục chứa các tệp phân phối. Tất nhiên, distthư mục không được kiểm tra trong kho lưu trữ Github.

Làm cách nào để xuất bản gói npm theo cách mà khi ai đó làm npm install, họ sẽ nhận được srccũng như distthư mục? Hiện tại khi tôi chạy npm publishtừ kho lưu trữ git của mình, nó dẫn đến chỉ srcxuất bản thư mục.

Package.json của tôi trông như thế này:

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

Câu trả lời:


102

Hãy xem trường "tệp" của tệp package.json https://docs.npmjs.com/files/package.json#files

Từ tài liệu:

Trường "tệp" là một mảng tệp để đưa vào dự án của bạn. Nếu bạn đặt tên một thư mục trong mảng, thì nó cũng sẽ bao gồm các tệp bên trong thư mục đó. (Trừ khi chúng bị bỏ qua bởi một quy tắc khác.)


3
Tôi tò mò muốn biết liệu trường "tệp" có ghi đè .gitignorehay không .npmignore(có vẻ như không phải như tôi đọc tài liệu) - @Naresh vui lòng cho chúng tôi biết cách nào hoạt động tốt.
topheman

8
"tệp" thực sự đang bỏ qua .gitignore. Tôi có "dist" trong .gitignore của mình, nhưng được bao gồm trong "tệp" và thư mục đang được xuất bản lên npm. "files" dường như là cách một số gói phổ biến như expess và bluebird đang xuất bản (trong khi có những gói khác sử dụng phương thức .npmignore). Hiện tại, tôi đang sử dụng "tệp" vì nó có vẻ là một cách trực tiếp hơn để nói những gì sẽ xuất bản. Nhưng cảm ơn cả hai bạn đã nâng cao kiến ​​thức của tôi về npm ít nhất hai lần trong ngày hôm nay!
Naresh

3
Cần lưu ý rằng nếu "tệp" được chỉ định thì chỉ những tệp đó những tệp duy nhất được bao gồm trong dự án của bạn (ngoài các tệp không thể loại trừ như package.json, v.v.)
bmacnaughton

176

Khi bạn npm publish, nếu bạn không có .npmignoretệp, npm sẽ sử dụng .gitignoretệp của bạn (trong trường hợp của bạn, bạn đã loại trừ distthư mục).

Để giải quyết vấn đề của bạn, hãy tạo một .npmignoretệp dựa trên .gitignoretệp của bạn , không bỏ qua thư mục dist .

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


3
cảm ơn vì phản hồi nhanh chóng của bạn. Câu trả lời của bạn chắc chắn là đúng, nhưng bây giờ tôi đang sử dụng phương pháp tiếp cận "tệp" do Eugene đề xuất vì nó có vẻ trực tiếp hơn với tôi. Vui lòng xem bình luận chi tiết của tôi dưới phản hồi của anh ấy.
Naresh

3
Cảm ơn bạn rất nhiều!
corvid

0

Ví dụ tối thiểu về cách sử dụng tệp dữ liệu từ tập lệnh

Một trường hợp sử dụng phổ biến khác là có các tệp dữ liệu mà tập lệnh của bạn cần sử dụng.

Điều này có thể được thực hiện dễ dàng bằng cách sử dụng các kỹ thuật được đề cập tại: Trong node.JS, làm cách nào để tôi có thể lấy đường dẫn của mô-đun mà tôi đã tải qua request đó là * not * mine (tức là trong một số node_module)

Ví dụ đầy đủ có thể được tìm thấy tại:

Với thiết lập này, tệp mydata.txtsẽ được đưa vào node_modules/cirosantilli-data-files/mydata.txtsau khi cài đặt vì chúng tôi đã thêm nó vào files:mục nhập của chúng tôi package.json.

myfuncSau đó, hàm của chúng tôi có thể tìm thấy tệp đó và sử dụng nội dung của nó bằng cách sử dụng require.resolve. Tất nhiên, nó cũng chỉ hoạt động trên tệp thực thi ./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());

Sau đó, is-installed-globallygói sẽ hữu ích nếu bạn muốn tạo các đường dẫn tương đối đến các tệp được phân phối tùy thuộc vào việc chúng được cài đặt cục bộ hay toàn cầu: Cách biết gói npm đã được cài đặt trên toàn cầu hay cục bộ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.