Dağıtım dosyalarıyla bir npm paketi nasıl yayınlanır?


126

Kaynağımı ve dağıtım dosyalarını içeren bir npm paketi yayınlamak istiyorum. Github depom src, JavaScript kaynak dosyalarını içeren klasör içeriyor. Derleme işlemi dist, dağıtım dosyalarını içeren bir klasör oluşturur . Elbette, distklasör Github deposuna kaydedilmez.

Bir npm paketini birisi yaptığında klasör kadar iyi npm installalacak şekilde nasıl yayınlayabilirim ? Şu anda git depomdan çalıştırdığımda , yalnızca klasörün yayınlanmasıyla sonuçlanıyor .srcdistnpm publishsrc

Package.json şuna benzer:

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

Yanıtlar:


103

Package.json dosyasının https://docs.npmjs.com/files/package.json#files dosyasının "dosyalar" alanına bir göz atın

Belgelerden:

"Dosyalar" alanı, projenize dahil edilecek dosyalar dizisidir. Dizideki bir klasörü adlandırırsanız, o klasör içindeki dosyaları da içerecektir. (Başka bir kural tarafından göz ardı edilmedikçe.)


3
"Dosyalar" alanının geçersiz olup olmadığını merak ediyorum .gitignoreveya .npmignore(belgeyi okuduğum gibi görünmüyor) - @Naresh lütfen bize hangi yolun iyi çalıştığını söyleyin.
topheman

8
"files" gerçekten .gitignore'u yok sayıyor. .Gitignore dosyamda "dist" var, ancak "dosyalara" dahil ediliyor ve klasör npm olarak yayınlanıyor. "files", expess ve bluebird gibi birkaç popüler paketin yayınlama şekli gibi görünüyor (.npmignore yöntemini kullanan başka paketler varken). Şimdilik "dosyalar" ile gidiyorum çünkü bu, ne yayınlayacağımı söylemenin daha doğrudan bir yolu gibi görünüyor. Ama ikinize de bugün npm hakkındaki bilgimi en az iki kez artırdığınız için teşekkürler!
Naresh

3
"Dosyalar" belirtilirse , projenize dahil edilenlerin yalnızca bu dosyalar olduğunu belirtmek gerekir (
paket.json

176

Bir dosyanız npm publishyoksa .npmignore, npm .gitignoredosyanızı kullanır (sizin durumunuzda distklasörü hariç tuttunuz ).

Sorunu çözmek için, bir oluşturmak .npmignoreiçin dayalı dosyayı .gitignore, dosyanın dist klasörü göz ardı etmeden .

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


3
hızlı cevabınız için teşekkürler Cevabınız kesinlikle doğru, ancak şimdilik Eugene'nin önerdiği "dosyalar" yaklaşımını kullanıyorum çünkü bana daha doğrudan geliyor. Lütfen yanıtının altındaki ayrıntılı yorumuma bakın.
Naresh

3
Çok teşekkür ederim!
corvid

0

Bir komut dosyasından veri dosyalarının nasıl kullanılacağına dair minimal örnek

Diğer bir yaygın kullanım durumu, komut dosyalarınızın kullanması gereken veri dosyalarına sahip olmaktır.

Bu, şu adreste belirtilen teknikleri kullanarak kolayca yapılabilir: node.JS'de, yüklediğim bir modülün yolunu nasıl * benim değil * (yani bazı düğüm_modüllerinde) gerektirir

Tam örnek şu adreste bulunabilir:

Bu kurulumla, dosya mydata.txtiçine koymak alır node_modules/cirosantilli-data-files/mydata.txtbizim onu ekledi çünkü kurulumdan sonra files:girişinde package.json.

Fonksiyonumuz myfuncdaha sonra bu dosyayı bulabilir ve içeriğini kullanarak kullanabilir require.resolve. ./cirosantilli-data-filesElbette sadece çalıştırılabilir dosya üzerinde de çalışır .

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-veri-files

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

is-installed-globallyPaket onlar bölgesel veya küresel olarak yüklenmiş olup olmadığını bağlı olarak dağıtılmış dosyalara göreli yolları üretmek istiyorsanız o zaman yararlıdır: npm paketi global veya yerel olarak yüklenmiş olup olmadığını nasıl anlaşılır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.