A előző NodeJs postban a modulokat taglaltam. Most nézzük meg, hogy mi van, ha nem mi írunk magunknak, hanem már előre elkészített modul-csomagokat szeretnénk használni, amik szerepelnek a hivatalos NodeJs csomag-jegyzékben. Erre való az NPM (Node Packaged Modules).
Az NPM egy különálló project, mely a csomagkezelést hivatott segíteni, könnyebbé tenni. Ez egészen odáig jutott, hogy jelenleg belekerült már a hivatalos Node telepítő csomagba, így ha valaki feltelepíti a Node-ot, automatikusan kapja vele együtt a NPM-et is. Amúgy a NPM-nek független weboldala van, itt. A Node részét képezi ugyan, de a Node weboldalán található külön menüpont is erre az oldalra mutat.
Jelenleg több, mint 27 000 csomag található meg a repóban és ez a szám folyamatosan csak növekszik. Döbbenetes érték, és tökéletesen mutatja azt, hogy mennyire népszerű a Node. Regisztrálhatunk magunknak egy hozzáférést, de erre csak akkor lesz szükségünk, ha a saját magunk által írt, új csomagot szeretnék publikálni. Ahhoz, hogy használjuk a csomagokat, nem kell tennünk semmi mást, csak installálni azt a NPM segítségével.
Csomag telepítése
Számos nagy sikerű csomag létezik, ezek közül is kiemelném az Express-t és a Socket.IO-t. A későbbiekben fogok ezekkel foglalkozni. Most példaképpen telepítsük fel az Express-t. Ehhez nem kell semmi mást tennünk, mint kiadni a következő parancsot:
$ npm install express
Ugye milyen bonyolult volt? :) A csomagkezelő feltelepíti a szükséges modulokat, függőségeket. A NPM-nek természetesen vannak kapcsolói és más opciói is. De ne szaladjunk előre… A legfontosabb dolog az, hogy amikor a fenti parancsot kiadjuk, a program a megadott csomagot az aktuális könyvtárba fogja telepíteni, LOKÁLISan a korábbi post-ban már említett node_modules könyvtárba! És itt álljunk meg egy kicsit, mivel fontos dologhoz érkeztünk…
Lokális és globális telepítés
Alapértelmezés szerint a NPM lokális telepítést hajt végre. Ez az előbb említett módon, az aktuális könyvtárban létrehoz (ha még nem létezik) egy node_modules könyvtárat és ebbe fogja a szükséges modulokat letölteni. Abban az esetben, ha készítünk egy alkalmazást, tudunk hivatkozni az adott modulra. Ellenben, ha kilépünk ebből a könyvtárból és egy másikban készítünk el egy programot, akkor ott már nem tudunk erre lokálisan telepített modulra hivatkozni. Lássunk egy példát!
Hozzunk létre két könyvtárat:
$ mkdir app01 $ mkdir app02
Lépjünk be az elsőbe és telepítsük az Express-t:
$ cd app01 $ npm install express
Készítsünk egy test04.js file-t:
$ touch test04.js
És hívjuk meg benne az előbb telepített Express modult:
var localExpress = require('express');
Mentsük el és futtassuk:
$ node test04.js
Látszólag semmi nem történik, csak visszakapjuk a prompt-ot. Valójában a program lefutott hiba nélkül, tehát a lokális modult megtalálta és betöltötte a localExpress változóba.
Most lépjünk át az app02 könyvtárba és hozzuk létre a test05.js file-t:
$ cd ../app02 $ touch test05.js
A tartalma legyen ugyan az, mint a test04.js file:
var localExpress = require('express');
Mentsük el és futtassuk:
$ node test05.js
És íme, megkaptuk az első Node hibánkat, ami a jelen esetben tökéletesen megfelelő számunkra! Valami ilyesmit:
module.js:340 throw err; ^ Error: Cannot find module 'express' at Function.Module._resolveFilename (module.js:338:15) at Function.Module._load (module.js:280:25) at Module.require (module.js:364:17) at require (module.js:380:17) at Object.<anonymous> (/root/nodejs-tutorials/app02/test05.js:1:82) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Function.Module.runMain (module.js:497:10)
Mi is ez? Ez azt mutatja, hogy amit az egyik könyvtárban telepítettünk modult, azt a másik könyvtárban nem tudjuk használni, mivel lokálisan telepítettük!
Természetesen van lehetőségünk arra is, hogy csak egyszer kelljen telepíteni a modult és bármelyik alkalmazásunk elérje azt. Ez a globális telepítés. De mi is történik ilyenkor? A válasz egyszerű: a különbség csak annyi a lokális és globális telepítő között, hogy a globális esetében (Unix rendszeren) az /usr/local/lib/node_modules könyvtárba kerülnek a csomagok. Ezt bármelyik Node alkalmazásunk eléri. Az /usr/local prefix módosítható természetesen a konfigurációban, ha máshol szeretnék tárolni ezeket. Az ide vonatkozó dokumentáció itt olvasható.
Link
Létezik egy köztes megoldás is, mely segítségével a lokálisan telepített csomagokat elérhetjük más alkalmazásokban is. Ez a Link-elés.
Ehhez a következőket kell tennünk: belépünk abba a könyvtárba, ahol a modult telepítettük (app01):
$ cd ../app01/node_modules/express/
Majd elkészítjük a linket, amit használhatunk majd a másik alkalmazásunknál:
$ npm link
Átlépünk az app02 könyvtárba és definiáljuk a modul-linket, amit használni akarunk:
$ cd ../../../app02 $ npm link express
Ha jól csináltunk eddig mindent, akkor a könyvtárban létrejött a node_modules alkönyvtár és benne az Express link. Most próbáljuk meg futtatni a test05.js programot, ami korábban hibát dobott.
$ node test05.js
Gratulálok! Sikeresen elkészítettük a linkelést a lokális csomagra.
Hogyan lehet megszüntetni a linkelt csomagokat? Abban a programkönyvtárban, ahol nincs szükség az adott link-re (példánkban az app02 könyvtár), adjuk ki a következő parancsot a csomag nevével:
$ npm unlink express
Csomag törlése
A telepítés ellentéte…
$ npm uninstall <csomagnév>
És ebből is létezik a globális verzió a globálisan telepített csomagokhoz.
$ npm uninstall -g <csomagnév>
Csomagok frissítése
A csomagok folyamatosan frissülnek a készítők által. Ahhoz, hogy nekünk is mindig naprakész verziók legyen mindenből, ki kell adni a frissítési parancsot:
$ npm update
Csomag keresése
Ha szeretnénk megnézni, hogy mely csomagok kerültek fel a rendszerünkre, akkor azt a
$ npm list
paranccsal tehetjük meg. Itt látni fogjuk a csomagfüggőségeket is.
Ha szűrni szeretnénk egy névre, például szeretnénk megtudni, hogy a Which modult használjuk-e valahol vagy függőségek között szerepel-e, akkor:
$ npm list Which