Belirli bir klasörü npm yayınlama, ancak paket kökü olarak


91

Kaynakları oluşturmak ve paketlemek ve adlı bir dizinde yayınlamak için bir yudum görevi içeren bir projem var dist. Amacım onu ​​bir npm paketi olarak yayınlamak, ancak yalnızca dağıtım klasörüm. Npm belgeleri kullanabilir miyim diyor filesihracat dosyaları belirtmek için etiketini. İşe yarıyor. Ancak dokümantasyon şunu da söylüyor:

Dizideki bir klasörü adlandırırsanız, o klasör içindeki dosyaları da içerecektir.

Sonuç, node_modules'e benzeyen bir npm paketidir:

oluşturulan npm paketi

Ancak tüm dosyalarımı paketin kök dizininde görmek isterim (bu distklasör olmadan ). Dosyam klasörün index.jsiçinde dist, ancak kök dizininde olmalı. Etiketi filesolarak ayarlamaya çalıştım /dist/**/*ama işe yaramadı.

Bunu nasıl başarabilirim?

Yanıtlar:


45

Ben de aynı arzuya sahibim, ancak bunu yalnızca npm takımlarını kullanarak gerçekleştirmenin bir yolu olmadığını düşünüyorum . Paketinizi düzenlemek için başka bir komut dosyası / araç kullanılabilir.

Alternatif çözüm

Şu anlatmaya diğer kopyalama am package.jsoniçine distklasöre ve ardından çalışan npm packdistklasöründe. Bence bu esasen paketimizin istenen düzenlemesini sağlıyor.

Bu npm tasarımıyla ilgili bazı okumalar: Node'da neden Directories.lib yok .

Ayrıca , jspm'nin npm paketini çözerken içindeki directories.libseçeneğe saygı duyduğunu package.jsonve dosyaları yeniden düzenlediğini not etmek ilginçtir . Tüm bunlar benim için gerçekleşti çünkü jspm veya npm / webpack tarafından tüketilebilecek ortak bir kitaplık oluşturmak istiyorum.


1
(Neden hiçbir Directories.lib ...) ölü bir bağlantı
Shanimal

1
Neden Node'daki hiçbir Directories.lib, bizim yöntemimizle yapmazsanız, acı hissetmeniz gerektiğini söylemiyor. Tüm bunlar, bu sorunu çözmek için araçlara ihtiyaç duyulmasıdır.
Brian Takita

6
Bu cevabın modası geçmiş olduğuna inanıyorum. Aşağıdaki yanıtlar npm pack, package.json filesve mainalanlarını kullanmayı not eder ve .npmignorebir geliştiriciye belirli, kurulabilir bir dizinden bir paket oluşturmak için gereken her şeyi verir.
Jefftopia

1

2
Birisi, npmignore, files ve main özelliği ile package.json içinde çözüme nasıl ulaşılabileceğini yayınlayabilir mi? Tüm dosyayı köke taşımak istiyorum ve dist klasörüne sahip olmak istemiyorum
Angad

17

Orijinal postere (@robsonrosa) benzer bir sorunum var. Benim durumumda bir distdizine derleyen typecript kullanıyorum . TypeScript'i kök dizine derleyebilsem de, en iyi çözümün package.jsondist dizininde ayrı bir dosya oluşturmak olduğunu düşünüyorum .
Bu, @scvnc'nin package.jsonama bir bükülme ile kopyalama önerisine benzer :

Paketleme işleminin bir parçası olarak, paket için kök dizindeki package.jsonana package.jsondosyaya dayalı ancak ondan farklı bir paket oluşturmalısınız.

Gerekçe:

  • Kök package.jsondosya, geliştirme dosyasıdır. Paket kullanıcısına faydası olmayan komut dosyaları veya geliştirme bağımlılıkları içerebilir, ancak sizin için güvenlik endişeleri oluşturabilir. Paketleme prosedürünüz, bu bilgileri üretimden çıkaran bir kod içerebilir package.json.
  • Paketinizi, farklı paket dosyaları gerektirebilecek farklı ortamlara dağıtmak isteyebilirsiniz (örneğin, farklı sürümlere veya bağımlılıklara sahip olmak isteyebilirsiniz).

--- DÜZENLE ---

Yorumlarda benden çözüm istendi. İşte kullandığım bazı kodlar. Bu bir örnek olarak düşünülmelidir, jenerik olması amaçlanmamıştır ve projelerime özgüdür.

Kurulumum:

package.json         - main package.json with dev dependencies and useful scripts.
.npmignore           - files to ignore; copied to 'dist' directory as part of the setup.
/src                 - directory where my typescript code resides.
/src/SetupPackage.ts - bit of code used to setup the package.
/dist                - destination directory for the compiled javascript files.

Yalnızca distdizini paketlemek istiyorum ve dizin, paketteki kök dizin olmalıdır.

Dosya SetupPackage.tsbenim de srcdizine derlenmiş olacak SetupPackage.jsyılında distdaktilo ile dizine:

import fs from "fs";

// DO NOT DELETE THIS FILE
// This file is used by build system to build a clean npm package with the compiled js files in the root of the package.
// It will not be included in the npm package.

function main() {
    const source = fs.readFileSync(__dirname + "/../package.json").toString('utf-8');
    const sourceObj = JSON.parse(source);
    sourceObj.scripts = {};
    sourceObj.devDependencies = {};
    if (sourceObj.main.startsWith("dist/")) {
        sourceObj.main = sourceObj.main.slice(5);
    }
    fs.writeFileSync(__dirname + "/package.json", Buffer.from(JSON.stringify(sourceObj, null, 2), "utf-8") );
    fs.writeFileSync(__dirname + "/version.txt", Buffer.from(sourceObj.version, "utf-8") );

    fs.copyFileSync(__dirname + "/../.npmignore", __dirname + "/.npmignore");
}

main();

Bu dosya:

  • Kökü kopyalar, package.jsonancak pakette gerekmeyen komut dosyalarını ve dev bağımlılıklarını kaldırır. Ayrıca pakete ana giriş noktasını da düzeltir.
  • Adlı package.jsondosyadan paketin sürümünü yazar version.txt.
  • .npmignorePaketi kökten kopyalar .

.Npmignore içeriği:

*.map
*.spec.*
SetupPackage.*
version.txt

Yani birim testleri (özellik dosyaları) ve typecript eşleme dosyalarının yanı sıra oluşturduğu SetupPackage.jsdosya ve dosya da yok sayılır version.txt. Bu, temiz bir paket bırakır.

Son olarak, ana package.jsondosya, oluşturma sistemi tarafından kullanılmak üzere aşağıdaki komut dosyalarına sahiptir ( shkabuk olarak kullanıldığını varsayar ).

"scripts": {
    "compile": "tsc",
    "clean": "rm -rf dist",
    "prebuildpackage": "npm run clean && npm run compile && node dist/SetupPackage.js",
    "buildpackage": "cd dist && npm pack"
  },

Paketi oluşturmak için derleme sistemi depoyu klonlar, yapar npm installve ardından aşağıdakileri çalıştırır npm run buildpackage:

  • distTemiz bir derleme sağlamak için dizini siler .
  • Daktilo kodunu javascript'e derler.
  • Paketlemeye SetupPackage.jshazırlanan dosyayı yürütür dist.
  • CD'leri distdizine aktarır ve paketi orada oluşturur.

version.txtDosyayı package.json'daki sürümü almanın ve depomu etiketlemenin kolay bir yolu olarak kullanıyorum . Bunu yapmanın sayısız başka yolu vardır veya sürümü otomatik olarak artırmak isteyebilirsiniz. Bunu çıkarın SetupPackage.tsve .npmignoresizin için yararlı değilse


Bu cevap en iyisine benziyor, ancak teorinin dışında hazır bir çözümünüz var mı?
yumaa

3
@yumaa Cevabımı somut bir örnekle düzenledim. Umarım yararlıdır.
Eli Algranti

1
Bazı değişikliklerle benim için çalıştı. Mevcut SetupPackage.tsdosya, dosyaları srcdizine kopyalar dist. Teşekkürler 👍
Harinder Singh

15

Projenizde git varsa küçük hack kullanabilirsiniz. Package.json'a sonraki komut dosyalarını ekleyin

    "prepublishOnly": "npm run build && cp -r ./lib/* . && rm -rf ./lib",
    "postpublish": "git clean -fd",

şimdi publishnpm include komutunu çalıştırdığınızda prepublishOnly. Dosyaları oluşturur ve libklasöre kaydeder (bir yapı betiği projenize bağlıdır). Sonraki komut dosyaları kök klasöre kopyalar ve kaldırır lib. Yayınlandıktan sonra postpublishkomut dosyası, projeyi önceki durumuna döndürür.


1
Bu çözümün hayranıyım!
DanMad

7

.npmignoreÖzellikle dağıtımlar için bir CI kullanıyorsanız, bir şeyleri taşımak veya kopyalamak yerine kullanmanızı şiddetle tavsiye ederim ve sadece oraya yayınlamak istemediğiniz dosyaları ekleyin.

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

Misal:

#tests
test
coverage

#build tools
.travis.yml
.jenkins.yml
.codeclimate.yml

#linters
.jscsrc
.jshintrc
.eslintrc*

#editor settings
.idea
.editorconfig

Güncelleme:

Kodunuzu aynı depoyu kullanarak farklı npm paketlerine bölmek istiyorsanız, yakın zamanda bu projeye rastladım: Lerna ve gerçekten iyi görünüyor.

Belki bir bakmalısın


9
Yine de yerleşik dosyalarımızı paketin kök dizininde yayınlamamız gerekir. CI için belki caizdir. Isaac'in bağlandığım blogundaki require('mypackage/foo')require('mypackage/dist/foo')
gönderiyi inceleyin

Bu sorunu burada çözmeye çalışmıyordum. Kodunuzu bölmek istiyorsanız, yakın zamanda bu projeye rastladım : lernajs.io ve gerçekten iyi görünüyor
Thram


yeh malzeme kullanıcı arayüzü kullanıyor ve bunu içinde kullandım. Son şirketim, iyi buldum
nick

6

Bu benim için iyi çalışıyor.

cd TMPDIR; npm pack/path/to/package.json

Tarball, TMPDIR dizini içinde yaratacaktır.


^ Bu cevap hafife alınmaktadır. npm packartı package.json filesalanı (veya .npmignore) harika çalışıyor.
Jefftopia

1

Anlamsal yayın kullanıyorsanız (ve öneririm) , pkgRootseçeneği .releaserc.jsondosyaya ekleyin :

{
  "pkgRoot": "dist",
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    "@semantic-release/npm",
    [
      "@semantic-release/exec",
      {
        "prepareCmd": "npx rjp package.json version nextRelease.version"
      }
    ],
    [
      "@semantic-release/git",
      {
        "assets": ["package.json"]
      }
    ],

  ],
}

Bu sorunu halleder. distKlasörünüzün bir package.jsondosya içerdiğinden emin olun . Kolayca bir ekleyerek bunu yapabilir cpsizin için postbuildkomut dosyası. Ayrıca rjp yükle


0

distKlasörü yayınlamanız gerekiyor

Bunu başarmanın doğal yolu, npm yaklaşımına göre, kök olacak klasörü yayınlamaktır. Bunu yapmanın birkaç yolu vardır ve çalışmak istediğiniz son ortama bağlıdır:

  1. npm <folder> dosyasını paket deponuzdan bir npm kayıt defterine yayınlayın ve ardından diğer paketleri kurarken paketinizi başka bir projeye yükleyin. Senin durumunda olur npm publish dist.
  2. npm , paketinizi yalnızca yerel olarak kullanmak istiyorsanız, başka bir projede <klasör> yükleyin . Senin durumunda diğer projeye gidipnpm install relative/path/to/dist
  3. npmnode_modules , orijinal paketinizdeki değişikliklerin anında başka bir projeye yansıtılmasını istemeniz durumunda , klasörünüzü başka bir projede yerel olarak bağlayın . Sizin durumunuzda önce cd distkoşarsınız npm linkve sonra diğer projeye gidip koşarsınız npm link robsonrosa-ui-alert.

Ön koşul : Yukarıdaki her durumda, yayınlama / yükleme / bağlantıdan önce, distklasörünüze en azından uygun bir package.jsondosya koymanız gerekir . Sizin durumunuzda, package.json dosyanızda paket adını tanımlamanız gerekir "name": "robsonrosa-ui-alert". Genellikle, README.md veya LICENSE gibi başka dosyaların da olmasını isteyeceksiniz.

Yöntem 2 ve 3'e açıklamalar

Bu şekilde yüklenen paketi kullandığınızda, genellikle paket bağımlılıkları ile ilgili sorunlar vardır. Bundan kaçınmak için, önce paketi paketleyin npm pack distve ardından paketi paketlenmiş tarball'dan hedef projeye yükleyin, yani npm install path/to/package-tarball.tgz.

Otomasyon örneği

prepareKomut dosyasıyla birlikte buildkomut dosyasını kullanarak yayınlama sürecini otomatikleştirebilirsiniz . Ek olarak, paket "private": truedeponuzun kök dizininde bulunan package.json alanına yerleştirilen alanla paket kök klasörünün yanlışlıkla yayımlanmasına karşı paketinizi koruyabilirsiniz . İşte bir örnek:

  "private": true,
  "scripts": {
    "build": "rm -rf dist && gulp build && cat ./package.json | grep -v '\"private\":' > dist/package.json",
    "prepare": "npm run build"
  },

Bu şekilde, yayınlama sürecinde kök klasörü yayınlamaz ve paketin oluşturulmasını ve package.json'un distklasöre otomatik olarak kopyalanmasını sağlayamazsınız .


-1

İşte en temiz olduğunu düşündüğüm bir yaklaşım daha. Dosyaları taşımaya veya derleme ve paketleme komut dosyalarında yolları belirtmeye gerek kalmadan tüm konfigürasyona dayalıdır:

package.json Ana dosyayı belirtin.

{
    "main": "lib/index.js",
}

Bazı ek daktilo seçenekleri:

  • Belirtin rootDir. Bu dizin tüm kaynak koduna sahip olacak ve içinde bir indexdosya (veya içinde main olarak kullanabileceğiniz başka bir dosya package.json) olmalıdır.
  • Belirtin outDir. Tsc komutunuzun inşa edeceği yer burasıdır

tsconfig.json

{
    "compilerOptions": {
        "rootDir": "src",
        "outDir": "lib",
    },
    ...

}

Bu, ismin dist'den lib'ye değiştirilmesi dışında, OP'nin sahip olduğu ile aynı değil mi?
Bob9630

-1

seçenek 1: Klasöre gidin ve "npm yayınla" yı çalıştırın. komut

seçenek 2: npm yayınlama / yol / dizinini çalıştır


-4

Sadece bir .npmignoredosya oluşturun ve aşağıdakileri ekleyin:

*.*
!dist/*

1
bu OP'nin talep ettiği gibi mi? Bunun işe yaramasını sağlayamadım. Buradaki fikir, yayınlanan paketin dizinin kendisini dahil etmeden yalnızca dist dizinin içeriğini içermesiydi. Bunu, dist dizininde olmayan ve package.json "dosyalar" listesiyle zaten yapılabilen hiçbir şeyi eklemediğimizden emin olmak için.
Bob9630
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.