Nullsoft Scriptable Install System
[8 May 2010]
Generalmente, il primo impatto con un programma è il suo installer.
Per questo quando (un anno fa!) ho finito Light and Dark 3 ho pensato che fosse il caso di sbattersi un po' anche su questo fronte.
Inoltre, il gioco richiedeva di salvare un file dll in una cartella di sistema, e mi scocciava distribuirlo con un file README.txt che dicesse cosa fare per farlo funzionare.
Ho quindi usato il
Nullsoft Scriptable Install System
.
Con NSIS si possono creare installer per Windows in base alle proprie necessità, personalizzando tutto fino nei minimi dettagli.
Funziona così:
- si scrive uno script per creare l'installer
- si (pseudo)compila lo script
Facile!
Più o meno, scrivere lo script non è proprio una passeggiata; ma il pacchetto di NSIS comprende diversi esempi che mostrano le varie possibilità.
Quindi basta:
- guardarsi un po' gli esempi
- capire esattamente cosa si vuole ottenere
- studiarsi un po' l'ottima documentazione (non fatta con Doxygen :P bensì con Halibut )
- scrivere lo script
Uno script di NSIS si compone di: attributi, pagine, sezioni, funzioni.
Installer attributes
Servono a personalizzare l'aspetto dell'installer e a impostare alcune preferenze. Ad esempio:
Name "Light and Dark 3"
Caption "Light and Dark 3 ${VERSIONE} - Setup"
Icon "${NSISDIR}\Light and Dark\modern-install-blue.ico"
OutFile "L&D3_installer_${VERSIONE}.exe"
InstallDir "$PROGRAMFILES\Light and Dark 3"
SetCompressor /SOLID lzma
CRCCheck on
BrandingText "Setup creato dai Raptor Studios con Nullsoft Scriptable Install System v2.43"
AutoCloseWindow false
ShowInstDetails hide
Pages
Sono le diverse fasi (le schermate) dell'installazione, ovvero:
Page license
Page components
Page directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles
Sections
Ogni sezione si riferisce a una delle componenti installabili; quando quella componente è scelta, la sua sezione sarà eseguita. Per esempio, nell'installer di L&D3 ci sono queste sezioni (vedi screenshot):
Section "Light and Dark 3" Game
SectionIn 1 RO
SetOutPath $INSTDIR
File /r Gioco\
[...]
SectionEnd
Section /o "(just for nerds)" Nerd
SectionIn 2 RO
SetOutPath $INSTDIR
File /r Gioco\
File Files\
MessageBox MB_OK "Leggi il file $\"installazione.txt$\" per sapere cosa devi fare."
SectionEnd
Section "File extra" Extra
SectionIn 1 2 3
SetOutPath $INSTDIR\Extra
File /r Extra\
SectionEnd
Functions
Vi sono 2 tipi di funzioni: le user functions e le callback functions.
Le user functions sono come le classiche funzioni: se hai delle istruzioni da eseguire più volte, le metti in una user function che chiamerai (con il comando CALL) in più punti dello script.
Le callback functions invece sono chiamate dall'installer quando si verifica una certa condizione; ad esempio questa viene chiamata se l'installazione fallisce:
Function .onInstFailed
MessageBox MB_OK "Installazione fallita. Ritenta e sarai più fortunato."
FunctionEnd
Questo che segue è l'intero script di Light and Dark 3.
Occhio, è piuttosto disordinato, e riguardandolo ora non riesco a capire il senso di qualche pezzo.
Però il risultato è soddisfacente :)
Light-and-Dark-3.nsi
!include "MUI2.nsh"
!include FontRegAdv.nsh
!include FontName.nsh
!define VERSIONE "v1.06"
!define NOMEXE "Game.exe"
Name "Light and Dark 3"
Caption "Light and Dark 3 ${VERSIONE} - Setup"
#Icon "${NSISDIR}\Light and Dark\modern-install-blue.ico"
OutFile "L&D3_installer_${VERSIONE}.exe"
InstallDir "$PROGRAMFILES\Light and Dark 3"
InstallDirRegKey HKCU "Software\Light and Dark 3" ""
SetCompressor /SOLID lzma
CRCCheck on
RequestExecutionLevel user
# Modern UI Settings
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Light and Dark\nsis2.bmp"
!define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Light and Dark\nsis1.bmp"
!define MUI_WELCOMEPAGE_TITLE "Benvenuti nel setup di Light and Dark 3 ${VERSIONE}"
!define MUI_WELCOMEPAGE_TEXT "Questo programma vi guiderà nell'installazione di Light and Dark 3 ${VERSIONE}.$\r$\n$\r$\nSiete pronti?$\r$\n$\r$\n$\r$\n$_CLICK"
!define MUI_COMPONENTSPAGE_CHECKBITMAP "${NSISDIR}\Light and Dark\simple.bmp"
!define MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO "Passa il mouse sulle componenti per ulteriori informazioni."
!define MUI_UNCONFIRMPAGE_TEXT_TOP "Disinstallazione completa di Light and Dark 3"
!insertmacro MUI_DEFAULT MUI_ICON "${NSISDIR}\Light and Dark\modern-install-blue-full.ico" #icona dell'installer
!insertmacro MUI_DEFAULT MUI_UNICON "${NSISDIR}\Light and Dark\modern-uninstall-blue-full.ico" #icona dell'uninstaller
XPStyle on
InstallColors /windows
InstProgressFlags smooth
BrandingText "Setup creato dai Raptor Studios con Nullsoft Scriptable Install System v2.43"
LicenseForceSelection radiobuttons "Accetto" "WTF?"
ComponentText "Oltre all'installazione automatica puoi scegliere quella manuale; riceverai le istruzioni per installare il gioco $\"manualmente$\", \
salvando i file indicati nelle cartelle del sistema." \
"Scegli il tipo di installazione:" " "
DirText "Il setup installerà le componenti selezionate nella seguente destinazione.$\r$\nPer scegliere un'altra destinazione, \
cliccare su $\"Sfoglia$\" e selezionare la cartella.$\r$\nCliccare su $\"Installa!$\" per procedere con l'installazione." \
"Cartella di destinazione" Sfoglia... "Seleziona la cartella dove installare Light and Dark 3:"
MiscButtonText
InstallButtonText Installa!
SpaceTexts "Spazio necessario: " "Spazio disponibile: "
DetailsButtonText "Mostra dettagli"
CompletedText "Completato!"
FileErrorText "Impossibile scrivere il file $\r$\n$0$\r$\nNel caso dei fonts (*.ttf), potrebbe essere già installato."
AutoCloseWindow false
ShowInstDetails hide
# Tipi di Installazione
InstType "Automatica"
InstType "Manuale"
InstType "File extra"
InstType /CUSTOMSTRING=Personalizzata
# Pagine
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\Light and Dark\Licenza.rtf"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Italian"
# Sezioni
Section "Light and Dark 3" Game
SectionIn 1 RO
SetOutPath $INSTDIR
File /r Gioco\
WriteRegStr HKCU "Software\Light and Dark 3" "" $INSTDIR
WriteUninstaller "$INSTDIR\Disinstalla L&D3.exe"
StrCpy $FONT_DIR $FONTS
!insertmacro InstallTTF 'BANGLE.TTF'
SetOutPath $WINDIR\system32
File "Files\RGSS103J.dll"
MessageBox MB_YESNO|MB_ICONQUESTION "Vuoi creare un collegamento al gioco sul desktop?" IDYES true IDNO false
true:
CreateShortCut "$DESKTOP\Light and Dark 3.lnk" "$INSTDIR\${NOMEXE}"
false:
SetOutPath $INSTDIR #do nothig
SectionEnd
Section /o "(just for nerds)" Nerd
SectionIn 2 RO
SetOutPath $INSTDIR
File /r Gioco\
File Files\
MessageBox MB_OK "Leggi il file $\"installazione.txt$\" per sapere cosa devi fare."
SectionEnd
Section "File extra" Extra
SectionIn 1 2 3
SetOutPath $INSTDIR\Extra
File /r Extra\
SectionEnd
# Descrizioni delle sections
LangString DESC_Game ${LANG_ITALIAN} "Installa il gioco e tutti i file necessari."
LangString DESC_Nerd ${LANG_ITALIAN} "Salva la cartella del gioco e le istruzioni per installarlo manualmente. Niente di difficile."
LangString DESC_Extra ${LANG_ITALIAN} "Comprende i file extra di Light and Dark 3, un archivio .zip la cui password si scoprirà \
finendo il gioco, e il gioco di carte $\"Lo Re$\"."
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${Game} $(DESC_Game)
!insertmacro MUI_DESCRIPTION_TEXT ${Nerd} $(DESC_Nerd)
!insertmacro MUI_DESCRIPTION_TEXT ${Extra} $(DESC_Extra)
!insertmacro MUI_FUNCTION_DESCRIPTION_END
# Uninstaller (questo mi pare non lo usassi neanche)
Section "Uninstall"
Delete "$INSTDIR\Disinstalla L&D3.exe"
Delete "$WINDIR\system32\RGSS103J.dll"
RMDir /r "$INSTDIR"
DeleteRegKey /ifempty HKCU "Software\Light and Dark 3"
SectionEnd
# Funzioni
Function .onInstFailed
MessageBox MB_OK "Ritenta e sarai più fortunato."
FunctionEnd
Function un.onInit
MessageBox MB_OK "Disinstallando Light and Dark, ogni file all'interno della cartella del gioco sarà cancellato."
FunctionEnd