Az NSIS szkriptvezérelt telepítőkészítő rendszer

A rendszer felépítése

Egy NSIS script telepítő tulajdonságokat, szekciókat és függvényeket tartalmazhat. A scriptnek tartalmaznia kell legalább egy OutFile utasítást (ez határozza meg, hogy a telepítő hova generálódjon), valamint egy szekciót. A telepítő tartalmaz(hat) kódot a szoftver eltávolítására vonatkozóan is, csakúgy, mint a telepítéshez, az NSIS az eltávolításhoz is segítséget nyújt.

Telepítő tulajdonságok

A telepítő tulajdonságot határozzák meg a generált telepítő viselkedését, kinézetét. Ezen utasítások nagyrésze általában nem változtatható futásidőben. Ilyen például a telepítő neve (Name utasítás). A Name utasításnak átadott szöveg megjelenik a telepítés során több helyen, például a címsorban és az üdvözlő szövegben. A többi utasítás részletes leírása megtalálható az NSIS dokumentációjában.

Oldalak

A generált telepítő - amennyiben nem csendes módban fut (csendes módban nem jelenik meg grafikus felület, ilyen módon települnek általában programkönyvtárak egy nagyobb alkalmazás telepítése során) - egy varázsló felépítésű felhasználói felületet jelenít meg. Ezek olyan oldalak, melyek között az Előző/Következő gombokkal lehet navigálni.

Azt, hogy milyen oldalak jelenjenek meg a telepítés során, a Page/UninstPage parancsokkal lehet beállítani (utóbbi az eltávolítási módban fut). Az alábbi érhetőek el:


Az alábbi példa egy tipikus oldalsorrendet határoz meg:
Page license Page components Page directory Page instfiles UninstPage uninstConfirm UninstPage instfiles
Az oldalak a szkriptben meghatározott sorrentben kerülnek megjelenítésre. Amint arról már esett szó az előző bekezdésekben, az elkészült telepítő generálni for egy eltávolító programot is, mely a telepített szoftver eltávolítására használható. Az eltávolítás módban az UninstPage utasítással megadott oldalak jelennek meg.

Szekciók

Általában egy telepítő nem mindig egy adott tartalmat telepít, hanem a felhasználó kiválaszthat bizonyos komponenseket, melyeket telepíteni szeretne. Az NSIS rendszer telepítője például lehetőséget ad a felhasználónak kiválasztani, hogy telepíti-e például a rendszer forráskódját, kiegészítőket, vagy példakódokat.

Az fejlesztők által írt script tényleges installációt végző része szekciókra van bontva. Minden szekció a komponensek oldalon megjelenik, mint telepítési lehetőség. Az itt megjelenő név a szekciónak megadott név. Ha egy komponenst a telepítést végző felhaználó kijelöl, akkor az ahhoz tartozó szekció kódja le fog futni a telepítés során. Habár lehetőség van arra, hogy a telepítő csak egy szekcióból álljon, ezzel nem lesz lehetősége a telepíést végző felhasználónak komponensek kiválasztására.

Csakúgy, mint az oldalak esetében, a szekciók esetében is lehetőség van olyan elemek meghatározására, melyek csak az eltávolítási módra vonatkoznak. Ezen szekciók neve un.-tal kezdődik.

A szekciókban használható utasítások nagyban különböznek a telepítő tulajdonságokat meghatározó utasításoktól, mivel ezen utasítások futtatható kóddá fordulnak, mely a telepítés során a telepítést végző számítógépen kerül végrehajtásra. Lehetőség van többek között fájlok kicsomagolására, a regisztrációs adatbázis olvasására, írására, INI fájlok szerkesztésére, mappák, parancsikonok létrehozására, és még sok egyéb művelet elvégzésére (a kiegészítők használatával pedig szinte bármi elvégezhető).

A legalapvetőbb utasítások a SetOutPath és a File. A File parancs a telepítő készítésekor (makensis futtatása közben) a megadott fájlt a telepítőkészletbe becsomagolja, majd a generált telepítő futtatásakor a SetOutPath által meghatározott helyre kerül kicsomagolásra (a rendszer a fájlokat tömöríti a helytakarékosság érdekében). Használhatunk bizonyos előre definiált változókat, mint például az $INSTDIR, mely a directory oldalon kiválasztott mappa elérési útját tartalmazza (telepítési mappa). Az alábbi példa két fájl telepíését végzi el, melyek a telepítő generálásakor a szkripttel azonos mappában helyezkednek el.

Section "My Program" SetOutPath $INSTDIR File "My Program.exe" File "Readme.txt" SectionEnd

Függvények

A függvények hasonlóak a szekciókhoz, de a futtatásuk különböző. A függvényeknek két típusa van, felhasználói függvények, és visszahívható - callback - függvények.

Míg a szekciók automatikusan lefutnak, ha a komponensek oldalon ki van jelölve a hozzájuk tartozó komponens, a felhasználói függvények viszont a fejlesztő által kerülnek meghívásra igény szerint a Call utasítás használatával. Ezek nem kerülnek végrehajtásra, amíg a fejlesztő meg nem hívja őket. Amint a függvény kódja lefut, a futás a függvényhívást okozó Call utasítás uáni utasítással folytatódik, kivéve, ha a telepítés megszakításra kerül az Abort parancs használatával (ez olyan körülmények esetén használandó, ha a telepítés során végzetes hiba keletkezett, ami miatt a telepítés nem fejezhető be). A felhasználói függvények hasonló céllal használhatóak, mint általában a metódusok, függvények egy programozási nyelvben. Céljuk a kód kiszervezése például újrafelhasználhatóság, vagy a karbantarthatóság növelése érdekében.

A callback függvények a telepítőkészlet által kerülnek meghívásra bizonyos események bekövetkeztekor. Ilyen események például a telepítőkészlet indulása (.onInit esemény), vagy a telepítés hiba miatti megszakítása (.onInstFailed). Callback függvények használata opcionális. Például ha a fejlesztő szeretné a felhasználót üdvözölni a telepítő indulásakor, akkor az alábbi kódrészlettel megteheti:

Function .onInit MessageBox MB_YESNO "This will install My Program. Do you wish to continue?" IDYES gogogo Abort gogogo: FunctionEnd

Az Abort utasításnak a callback függvényekben különböző hatásuk lehet. Az .onInit függvényben például meghívása után nem következik be a .onInstFailed esemény, hanem a telepítő egyből kilép. Ezen körülmények részletes leírása a callback függvények dokumentációjában megtalálható.

Változók

Változók a Var utasítással definiálhatóak, és hivatkozásukkor mindig $ jellel kezdődnek. Ezek globálisak, és bármely szekcióban vagy függvényben használhatóak.

Var BLA ;Declare the variable Section bla StrCpy $BLA "123"; SectionEnd
Ez a kód a szekció futása során beállítja a $BLA válrozó értékét az "123" (string típusú) értékre.

Lehetőség van verem használatára is, mely egyebek mellett átmeneti tárolóként is használható. A vermet a Push és Pull műveletek segítségével lehet használni. Ez a két utasítás rendre hozzáad egy elemet a veremhez, illetve eltávolít egy elemet a veremből.

Előre definiáltan lehetőség van 20 darab regiszter használatára. Az első regiszter elérése a $0 vagy $R0 hivatkozásokkal érhető el. Ezek a változók globálisík, így függvényhívásuk előtt célszerű az értéküket a veremre helyezni, majd a hívás után onnan eltávolítani, például:

Function bla Push $R0 Push $R1 ...code... Pop $R1 Pop $R0 FunctionEnd

Fordító

Az NSIS szkriptek fordítását a rendszer fordítója, a makensis.exe végzi. Ez beolvassa a szkriptet, feldolgozza annak tartalmát, és az alapján - valamint az általa hivatkozott fájlok alapján - készít egy telepítőkészletet.

Ha az NSIS rendszer telepítő segítségével került telepítésre, az nsi szkriptre jobb gombbal kattintva a környezeti benüben megjelenik egy Compile NSIS script nevű elem. Erre kattintva megnyílik a MakeNSISW nevű alkalmazás, mellyel grafikus felületről készíthető, tesztelhető a telepítőkészlet (a makensis.exe alkalmazás parancssorban fut).

A fordítás során a fordító ellenőrzi, hogy a szkript szintaktikailag és szemantikailag helyes-e, és ha hibát észlel (például ha nem megfelelő számú argumentum tartozik egy utasításhoz), akkor megszakítja a telepítőkészlet-generálási folyamatot, és egy rövid hibaüzenettel, valamint annak a sornak a számával, amelyikben a hiba található, értesíti a felhasználót. Ha a szkript nem tartalmaz ilyen hibákat, akkor a fordító lefutásakor a telepítőkészlet a megadott helyen elkészül, terjeszthető a célfelhasználók felé.

Az NSIS különböző tömörítési metódusokat használhat, hogy a telepítőkészlet mérete minél kisebb legyen. Mivel ezek általában hálózaton keresztül kerülnek terjesztésre, ez egy fontos tényező. A ZLIB az alapértelmezett tömörítési algoritmus, amely gyors, és alacsony a memóriaigénye. Az LZMA tömörítés lényegesen kisebb telepítőkészletet eredményezhet, ám lassabb, és memóriaigénye is nagyobb. A BZIP2 általában jobban teljesít a ZLIB-nél, de nem teljesít olyan jól, mint az LZMA. Ez az algoritmus akkor lehet hasznos, ha alacsony memóriahasználatra van szükség, és aránylag gyors fordításra.

Lehetőség van Windows telepítő készítésére Linux, BSD és Mac OSX rendszereken is, részletek az NSIS fordítása oldalon olvashatóak.