NodeJs NPM – A nyakkendős modulraktáros

By | 2013. április 12.

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

 

 

Hasonló cikkek

NodeJs – A szerver-oldali báránybőrbe bújt f... Egy korábbi post-omban írtam arról, hogy megpróbálkozom a APE server telepítésével és későbbi használatával. Nos, ebből az valósult meg, hogy a sikere...
MucsaPlex, avagy Plex szerver RaspberryPi 3-on Csak a kíváncsiság kedvéért összeraktam egy rPi3-as Plex szervert, mivel kíváncsi voltam, hogy hogyan muzsikál egy ilyen jószág a rettegett erőforrási...
NodeJs – Modulok Egy korábbi post-ban bemutattam, hogy mi is a NodeJs és hogyan kell telepíteni, valamint túl vagyunk az első "Hello World!" programunkon is. A mostani...
APE Server – 1. rész: A Majom leszállt Tegnap Friday afternoon Project keretén belül elkezdtem feltelepíteni egy APE szervert. Már rég óta tervezem ezt, de eddig még nem jutott rá időm sajn...