Ako publikovať package do npm

npm (node package manager) je nástroj, ktorý pozná snáď každý frontend developer. Tí, ktorí npm nepoznajú, si ho môžu predstaviť ako register (databázu), ktorý využívajú milióny developerov na zdieľanie a používanie packages (balíčkov alebo modulov). Na nasledujúcich riadkoch si ukážeme, ako okrem využívania npm vieme do tejto databázy prispieť.

Predpokladám, že každý kto sa s npm už stretol, vie minimálne nainštalovať, použiť a odinštalovať package. Preto preskočím úvod a prejdem rovno k tomu, ako dostať vlastný modul do databázy npm, aby bol verejne dostupný. Ak by sme chceli, aby bol modul privátny, teda dostupný len určitým ľudom, musíme si zriadiť platené konto.

Súbor package.json

V skutočnosti môžeme publikovať každý priečinok, ktorý obsahuje súbor package.json. Tento súbor určite väčšina developerov pozná. Je to súbor, ktorý obsahuje informácie o aplikácii alebo module. Musí však obsahovať minimálne:

  • name - názov modulu
  • version - verziu modulu

name

Názov modulu musí byť jedinečný, aby nekolidoval s iným názvom v npm registri a mal by dodržiavať npm policy. Je možné názov package aj prefixovať, tak ako v našom prípade - @odyzeo/pluralize. Ak sa však pokúsime publikovať takýto modul, dostaneme error:

npm ERR! publish Failed PUT 402
npm ERR! code E402
npm ERR! You must sign up for private packages : @odyzeo/pluralize

Error nastane z dôvodu, že scoped (prefixované) moduly sú automaticky privátne, a teda platené. BTW platené konto stojí momentálne 7$/mesiac pre jednotlivca.

My však chceme, aby bol náš modul verejný. Náš príkaz bude tak pri publikovaní vyzerať nasledovne (spoiler alert).

npm publish —access=public

version

Verzia nášho modulu. Pri každom publikovaní musí byť iná a vo formáte major.minor.patch:

major - ak robíme nekompatibilné zmeny s predchádzajúcimi verziami
minor - robíme zmeny funkcionality so spätnou kompatibilitou
patch - fixujeme bugy so spätnou kompatibilitou

https://semver.org/

Súbor package.json vytvoríme buď manuálne, alebo jednoduchšie, príkazom:

npm init

Defaultný package.json, ktorý sa predvyplní obsahom priečinku, v ktorom sa nachádzame, vytvoríme príkazom:

npm init -y

Keď postupne prejdeme celým procesom, vznikne nám niečo takéto:

  • description - stručný popis modulu
  • main - východzí súbor modulu
  • scripts - príkazy, ktoré pomáhajú pri developovaní
  • test - príkazy na spustenie testov
  • keywords - kľučové slová, podľa ktorých vieme náš modul vyhľadať
  • repository - odkaz na repozitár, k tomu sa ešte dostaneme
  • author - autor modulu
  • licence - licencia, pod ktorou sa modul môže používať

Dôležitá je aj časť dependencies, ktorá obsahuje zoznam modulov s verziami, ktoré sú potrebné pre správne fungovanie modulu. Prípadne devDependencies, zoznam modulov potrebných pre vývoj modulu, ktoré avšak nie sú potrebné pre jeho používanie. Náš mini modul je čistý, a preto nepotrebuje žiadne závislosti :)

Vytvorenie konta

Aby sme mohli modul publikovať, musíme mať vytvorené konto v npm registri. To si vytvoríme ľahko, zaregistrovaním na stránkach https://www.npmjs.com/signup, alebo v termináli priíkazom:

npm adduser

Ak už konto máme, prihlásime sa príkazom:

npm login

Na stránke https://www.npmjs.com/~username nájdeme svoj npm profil ak username nahradíme svojim loginom.

Súbor .gitignore

Všetky súbory v priečinku, v ktorom sa nachádzame, budú publikované, takže ak sa za niektoré hanbíme a nechceme ich svetu ukázať, zahrnieme ich do .gitignore súboru. Viac na stránkach git basics.

Chcelo by to nejaký kód

Pre ukážku publikovania modulu do npm si napíšeme pár riadkov zbytočného kódu. Nie je to žiaden prelomový startup, len nám to vráti správny slovenský tvar množného čísla zadaného slova. Určite vám hneď napadne x lepších riešení, ale kód v našom prípade nehrá rolu. Takže len pre ukážku:

Dokumentácia v readme.md

Aj keď do dokumentácie sa nám developerom veľmi nechce, vždy ich s obľubou čítame. Aby sme uľahčili život tým, ktorí budú modul používať, je rozumné tento súbor vytvoriť. Prípona .md hovorí, že je súbor napisaný v jazyku Markdown. Určite si už každý developer čítal readme, takže má predstavu, že by mal obsahovať inštrukcie, čo daný modul robí, ako sa inštaluje a ako sa používa.

Tento súbor sa zobrazuje na úvodnej stránke modulu na stránkach npm a takisto aj v git repozitári ... git čo?

Git

Každý pozná, videl, zvíťazil. Je pekné prepojiť package priamo s git repozitárom. Aby nám ostatní developeri mohli hejtovať kód. Ten sa väčšinou nachádza na GitHub-e a s naším modulom sa prepojí veľmi jednoducho, pridaním pár riadkov do súboru package.json:

"repository": {
  "type": "git",
  "url": "https://github.com/odyzeo/pluralize.git"
},

Poďme publikovať!

Ak je náš modul odladený, otestovaný a pripravený uzrieť svetlo sveta, spustíme príkaz:

npm publish

V našom prípade:

npm publish —access=public

To je všetko. Na stránke npm nájdete svoj modul s aktuálnou verziou:

@odyzeo/pluralize

npm nám pošle pochvalný email, že náš modul je úspešne publikovaný a pripravený na použitie.

Collaborators alebo spolupracovníci

Ak na module pracuje viac zodpovedných(!) developerov, pridáme im práva publikovať modul nasledovným príkazom:

npm owner add [username]

Ďalšie verzie

Ako sme už spomínali, každé publikovanie packagu musí obsahovať unikátnu verziu. Samozrejme sa nám nechce meniť verzie ručne, a preto nám npm vytvoril príkaz:

npm version [major|minor|patch]

Takto nám vznikne commit, ktorý inkrementuje verziu modulu v súbore package.json. Zmeny stačí už len push-núť a modul publikovať s novou verziou.

git push
npm publish

Changelog

Best practice je zmeny v každej verzii popísať, aby developeri vedeli, ako sme náš modul vylepšili. A hlavne, čo sme fixli. S tým nám vie pomôcť časť Releases na GitHub-e, kde si to vieme vyklikať a hlavne otagovať verziu, aby sme sa vedeli v projektoch odvolať na konkrétnu a niekomu sme nerozbili projekt upraveným kódom.

V GitHub-e nám po preklikaní sa release procesom vznikne nový tag, kde vieme spísať zmeny v novej verzii 

Prečo toto všetko?

Ako frontend programátori dookola zobrazujeme, filtrujeme a transformujeme dáta. Po pár projektoch zistíme, že robíme to isté, a tak namiesto kopírovania kúskov kódu a zliepania z projektu do projektu, je lepšie obetovať pár chvíľ a ten opakovaný kúsok kódu vyabstrahovať do prepoužiteľnej funkcionality v podobe samostatného modulu. Koleso už bolo vynájdené mnohokrát, nájdeme ho v npm.

Ďakujem za pozornosť. Veľa hviezdičiek a málo issues prajem.