본문으로 바로가기

[NSIS] 스크립트 템플릿

category 유틸리티/NSIS 2016. 3. 22. 18:31

프로그램 등의 배포를 위해 NSIS(Nullsoft Scriptable Install System)를 사용하여 설치용 인스톨 파일로 패키징하는 경우가 간혹 있는데, 이녀석이 스크립트 기반으로 동작하는 구조인지라 정리해 둔다.


NSIS 작업환경 구축

1. NSIS 설치 : http://nsis.sourceforge.net/
2. HM NIS Edit 설치 : http://hmne.sourceforge.net

최소화 버전

OutFile "TEST_installer.exe"
InstallDir "$PROGRAMFILES\TEST"
SetOverWrite on

Section "TEST"
  SetOutPath "$INSTDIR"
  File "..."
  File "..."
  SetAutoClose True
SectionEnd
사실 이정도 스크립트만 가지고도 패키징이 가능하다.
OutFile : 생성하고자 하는 인스톨 파일명
InstallDir : 기본 설치 디렉터리 지정
SetOutPath : 설치(복사)하고자 하는 디렉터리 지정
File : 설치하고자 하는 파일들 ..

MUI 적용 버전

프로그램을 인스톨했는데 화면만 잠시 깜박 거리고 아무것도 안나타난다면 '이건 뭐 ?', '바이러슨가 ?', '설치는 된거냐 ?' 라는 반응이 예상되기에 조금은 더 복잡한 스크립트로 설치 과정을 보여주자.

사용자에게 그럴듯한(?) 설치 과정을 보여주는 것이 심리적 불안감을 줄여줄 것이다.



아래의 스크립트는 대부분 많이들 사용하시는 것들을 취합(?) 해서 NSIS의 MUI(Modern User Interface)를 적용하여 기본적인 템플릿으로 기록해 둔 것이다.

;##########################################################
; define Settings
;##########################################################

;----------------------------------------------------------
; 배포 프로그램 이름, 버전 및 기타 변수
;----------------------------------------------------------
!define PRODUCT_NAME "Project NSIS"
!define PRODUCT_VERSION "v0.0.1"
!define PRODUCT_PUBLISHER "Publisher Name"
!define PRODUCT_WEBSITE "http://wonsx.tistory.com"

!define EXEFILE_NAME "TEST_NSIS"
!define EXEFULL_NAME "${EXEFILE_NAME}.exe"
!define EXEFILE_DIR "$PROGRAMFILES\${PRODUCT_NAME}"
!define OUTFILE_NAME "${PRODUCT_NAME}_${PRODUCT_VERSION}_installer.exe"

BrandingText ":: ${PRODUCT_PUBLISHER} - [${PRODUCT_WEBSITE}]"

;----------------------------------------------------------
; 레지스트리 키 지정
;----------------------------------------------------------
!define REG_ROOT_KEY "HKLM"
!define REG_UNROOT_KEY "HKLM"
!define REG_APPDIR_KEY "Software\Microsoft\Windows\CurrentVersion\App Path\${EXEFULL_NAME}"
!define REG_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"


;##########################################################
; MUI Settings
;##########################################################

;----------------------------------------------------------
; Request application privileges for Windows Vista
;----------------------------------------------------------
RequestExecutionLevel admin

;----------------------------------------------------------
; include
;----------------------------------------------------------
!include "MUI.nsh"

;----------------------------------------------------------
; 인스톨러 & 언인스톨러 아이콘 설정
;----------------------------------------------------------
!define MUI_ICON "icon\inst.ico"
!define MUI_UNICON "icon\uninst.ico"

;----------------------------------------------------------
; installer or uninstaller 닫을 경우 경고 메시지 상자를 출력
;----------------------------------------------------------
!define MUI_ABORTWARNING
!define MUI_UNABORTWARNING

;----------------------------------------------------------
; finishpage noAutoClose
;----------------------------------------------------------
!define MUI_FINISHPAGE_NOAUTOCLOSE
!define MUI_UNFINISHPAGE_NOAUTOCLOSE


;##########################################################
; MUI Pages
;##########################################################

;----------------------------------------------------------
; Page Design
;----------------------------------------------------------
; installer or uninstaller Header image (150x57)
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP_NOSTRETCH
!define MUI_HEADERIMAGE_BITMAP "img\header_inst.bmp" ; 150x57
!define MUI_HEADERIMAGE_UNBITMAP_NOSTRETCH
!define MUI_HEADERIMAGE_UNBITMAP "img\header_uninst.bmp" ; 150x57
!define MUI_BGCOLOR FFFFFF ; Default: FFFFFF

; installer Welcome & Finish page image (191x290)
!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH
!define MUI_WELCOMEFINISHPAGE_BITMAP "img\welcome_inst.bmp"

; uninstaller Welcome & Finish page image (191x290)
!define MUI_UNWELCOMEFINISHPAGE_BITMAP_NOSTRETCH
!define MUI_UNWELCOMEFINISHPAGE_BITMAP "img\welcome_uninst.bmp"

;----------------------------------------------------------
; Installer page
;----------------------------------------------------------

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "License.txt"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

;----------------------------------------------------------
; Uninstaller pages
;----------------------------------------------------------

!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

;----------------------------------------------------------
; Language Files
;----------------------------------------------------------
!insertmacro MUI_LANGUAGE "Korean"


;##########################################################
; NSIS Settings
;##########################################################

;----------------------------------------------------------
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${OUTFILE_NAME}"
InstallDir "${EXEFILE_DIR}"

ShowInstDetails show
ShowUninstDetails show

SetCompress off
SetCompressor lzma

SetOverWrite on ; on|off|try|ifnewer|ifdiff|lastused

;----------------------------------------------------------
InstallDirRegKey ${REG_ROOT_KEY} "${REG_APPDIR_KEY}" "Install_Dir"


;##########################################################
; SECTION
;##########################################################

;----------------------------------------------------------
Section "!Base (required)"
	
  DetailPrint "Extracting package..."
  SetDetailsPrint listonly
	
  SetOutPath "$INSTDIR"
  File "TEST_NSIS.exe"
	
  SetOutPath "$INSTDIR\doc"
  File "TEST_NSIS.txt"
  
  ; 바탕화면에 바로가기 등록
  CreateShortCut "$DESKTOP\${EXEFILE_NAME}.lnk" "$INSTDIR\${EXEFULL_NAME}"
  ; 시작-프로그램에 바로가기 등록
  CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${EXEFILE_NAME}.lnk" "$INSTDIR\${EXEFULL_NAME}"
  CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe"

  ; registry - installation path
  WriteRegStr ${REG_ROOT_KEY} "${REG_APPDIR_KEY}" "Install_Dir" "$INSTDIR"
  WriteRegStr ${REG_ROOT_KEY} "${REG_APPDIR_KEY}" "" "$INSTDIR\${EXEFULL_NAME}"
  ; registry - uninstall info
  WriteRegStr ${REG_UNROOT_KEY} "${REG_UNINST_KEY}" "DisplayName" "$(^Name)"
  WriteRegStr ${REG_UNROOT_KEY} "${REG_UNINST_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe"
  WriteRegStr ${REG_UNROOT_KEY} "${REG_UNINST_KEY}" "DisplayIcon" "$INSTDIR\${EXEFULL_NAME}"
  WriteRegStr ${REG_UNROOT_KEY} "${REG_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${REG_UNROOT_KEY} "${REG_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEBSITE}"
  WriteRegStr ${REG_UNROOT_KEY} "${REG_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
  
  ; create Uninstaller
  WriteUninstaller "$INSTDIR\Uninstall.exe"
  
SectionEnd

;----------------------------------------------------------
Section Uninstall
  RMDir /r "$INSTDIR"

  Delete "$DESKTOP\${EXEFILE_NAME}.lnk"
  RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"

  DeleteRegKey ${REG_ROOT_KEY} "${REG_APPDIR_KEY}"
  DeleteRegKey ${REG_UNROOT_KEY} "${REG_UNINST_KEY}"

SectionEnd
보완할 내용도 있는 듯 하고, 내용에 대한 설명은 나중에 ... 찬찬히 ... 기회가 된다면 ^^ㅋ