Mam projekt, który obejmuje proste zadanie tworzenia i pakowania źródeł oraz wydawania w katalogu o nazwie dist
. Moim celem jest opublikowanie go jako pakietu npm, ale tylko mój folder dist. Dokumentacja npm mówi, że mogę użyć files
tagu do określenia plików do wyeksportowania. To działa. Ale dokumentacja mówi również, że:
Jeśli nazwiesz folder w tablicy, będzie on również zawierał pliki w tym folderze
Rezultatem jest pakiet npm, którego node_modules wygląda następująco:
Ale chciałbym widzieć wszystkie moje pliki w katalogu głównym pakietu (bez tego dist
folderu). Mój index.js
plik znajduje się w dist
folderze, ale powinien znajdować się w katalogu głównym. Próbowałem ustawić tagfiles
jako, /dist/**/*
ale to nie zadziałało.
Jak mogę to osiągnąć?
źródło
npm pack
, package.jsonfiles
imain
fields,.npmignore
daje programiście wszystko, co jest potrzebne do utworzenia pakietu z określonego katalogu, który można zainstalować.Mam podobny problem do oryginalnego plakatu (@robsonrosa). W moim przypadku używam typecript, który kompiluje do
dist
katalogu. Chociaż mógłbym skompilować maszynę do katalogu głównego, myślę, że najlepszym rozwiązaniem jest wygenerowanie oddzielnegopackage.json
pliku w katalogu dist.Jest to podobne do sugestii @scvnc, aby skopiować plik,
package.json
ale z niespodzianką :W ramach procesu pakowania należy wygenerować
package.json
dla pakietu, który jest oparty na głównympackage.json
pliku w katalogu głównym, ale różni się od niegoUzasadnienie:
package.json
jest plikiem deweloperskim. Może zawierać skrypty lub zależności programistyczne, które nie są przydatne dla użytkownika pakietu, ale mogą stanowić zagrożenie dla Ciebie. Twoja procedura pakowania może obejmować kod, który usuwa te informacje z produkcjipackage.json
.--- EDYTOWAĆ ---
W komentarzach poproszono mnie o rozwiązanie. Oto kod, którego używam. Należy to traktować jako przykład. Nie ma być ogólny i jest specyficzny dla moich projektów.
Moja konfiguracja:
Chcę spakować tylko
dist
katalog, a katalog powinien być katalogiem głównym w pakiecie.Plik
SetupPackage.ts
w moimsrc
katalogu zostaną skompilowane doSetupPackage.js
wdist
katalogu przez maszynopisu:Ten plik:
package.json
ale usuwa skrypty i zależności dev, które nie są potrzebne w pakiecie. Naprawia również główny punkt wejścia do pakietu.package.json
do pliku o nazwieversion.txt
..npmignore
pakiet z katalogu głównego.Zawartość .npmignore to:
Tj. Testy jednostkowe (pliki specyfikacji) i pliki map maszynopisów są ignorowane, podobnie jak
SetupPackage.js
plik iversion.txt
plik, który tworzy. To pozostawia czysty pakiet.Wreszcie główny
package.json
plik zawiera następujące skrypty do użytku przez system kompilacji (zakłada, żesh
jest używany jako powłoka).Aby zbudować pakiet, system kompilacji klonuje repozytorium, wykonuje,
npm install
a następnie uruchamia,npm run buildpackage
co z kolei:dist
katalog, zapewniając czystą kompilację.SetupPackage.js
plik, który przygotowuje siędist
do pakowania.dist
katalogu i tam buduje pakiet.Używam tego
version.txt
pliku jako łatwego sposobu na pobranie wersji w package.json i otagowanie mojego repozytorium. Istnieje wiele innych sposobów, aby to zrobić, lub możesz chcieć automatycznie zwiększyć wersję. Usuń to zSetupPackage.ts
i.npmignore
jeśli nie jest to dla Ciebie przydatne.źródło
Jeśli twój projekt ma git, możesz użyć małego hacka. Dodaj kolejne skrypty do pliku package.json
teraz, kiedy uruchamiasz
publish
polecenie npm includeprepublishOnly
. Buduje pliki i zapisuje je wlib
folderze (skrypt kompilacji zależy od projektu). Następne polecenie kopiuje pliki do folderu głównego i usuwalib
. Po opublikowaniupostpublish
skrypt przywraca projekt do poprzedniego stanu.źródło
Zdecydowanie zalecam używanie
.npmignore
zamiast przenoszenia lub kopiowania rzeczy, szczególnie jeśli używasz CI do wdrożeń, i po prostu dodaj tam pliki, których nie chcesz publikować.https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package
Przykład:
Aktualizacja:
Jeśli chcesz podzielić swój kod na różne pakiety npm przy użyciu tego samego repozytorium, wpadłem ostatnio na ten projekt: Lerna i wygląda naprawdę dobrze.
Może powinieneś rzucić okiem
źródło
require('mypackage/foo')
require('mypackage/dist/foo')
U mnie to działa dobrze.
cd TMPDIR;
npm pack
/path/to/package.jsonTarball utworzy w katalogu TMPDIR.
źródło
npm pack
plusfiles
pole package.json (lub.npmignore
) działa wspaniale.Musisz opublikować
dist
folderNaturalnym sposobem osiągnięcia tego, zgodnie z podejściem npm, jest opublikowanie folderu, który ma być katalogiem głównym. Można to zrobić na kilka sposobów, w zależności od końcowego środowiska, z którym chcesz pracować:
npm publish dist
.npm install relative/path/to/dist
node_modules
w innym projekcie, na wypadek gdybyś chciał, aby zmiany w oryginalnym pakiecie zostały natychmiast odzwierciedlone w innym projekcie. W twoim przypadku najpierwcd dist
uruchamiasz,npm link
a potem przechodzisz do innego projektu i uruchamiasznpm link robsonrosa-ui-alert
.Warunek wstępny : w każdym przypadku powyżej, przed opublikowaniem / instalacją / linkiem, musisz umieścić w swoim
dist
folderze co najmniej odpowiednipackage.json
plik. W twoim przypadku musisz mieć nazwę pakietu zdefiniowaną w pliku package.json jako"name": "robsonrosa-ui-alert"
. Zwykle będziesz potrzebować także innych plików, takich jak README.md lub LICENCJA.Przykład automatyzacji
Możesz zautomatyzować proces publikacji za pomocą
prepare
skryptu w połączeniu zebuild
skryptem. Dodatkowo możesz zabezpieczyć swój pakiet przed przypadkowym opublikowaniem głównego folderu pakietu, wpisując"private": true
pole w pliku package.json, znajdującym się w katalogu głównym repozytorium pakietów. Oto przykład:"private": true, "scripts": { "build": "rm -rf dist && gulp build && cat ./package.json | grep -v '\"private\":' > dist/package.json", "prepare": "npm run build" },
W ten sposób nie opublikujesz folderu głównego i nie otrzymasz skompilowanego pakietu i pliku package.json skopiowanego do
dist
folderu automatycznie w trakcie procesu publikowania.źródło
opcja 1: przejdź do folderu i wykonaj polecenie „npm opublikuj”. Komenda
opcja 2: Uruchom npm publikacja / ścieżka / katalog
źródło
Oto jeszcze jedno podejście, które moim zdaniem jest najczystsze. Wszystko opiera się na konfiguracji bez konieczności przenoszenia plików lub określania ścieżek w skryptach kompilacji i pakowania:
package.json
Określ plik główny.Dodatkowe opcje maszynopisu:
rootDir
. Ten katalog będzie zawierał cały kod źródłowy i powinien zawieraćindex
plik (lub inny plik, którego możesz użyć jako głównego wpackage.json
).outDir
. To jest miejsce, w którym Twoje polecenie tsc będzie budowaćtsconfig.json
źródło
Po prostu utwórz
.npmignore
plik i dodaj do niego:źródło