최근 수정 시각 : 2023-11-09 19:58:31

NSIS



1. 개요2. 소스 코드
2.1. 코드 예제
3. 플러그인
3.1. 기본 플러그인

1. 개요

Nullsoft Scriptable Install System
Windows용 오픈소스 설치(Setup) 프로그램 제작 툴 홈페이지

원래 Winamp를 만든 Nullsoft의 저스틴 프랑켈이 Winamp의 설치프로그램을 만들기 위해서 만든 제작툴을 2001년 오픈소스로 공개한 것이 이후 여러 개발자에 의해서 업데이트 되고 있다.

NSIS가 처음 공개된 2001년에는 인스톨 쉴드와 같은 상업적인 설치 프로그램 개발 툴만이 존재하고 있었는데, 인스톨 쉴드는 무겁다는 단점이 있었다. NSIS가 공개된 이후 수많은 상용 소프트웨어 및 오픈소스 프로젝트에서 NSIS를 사용하고 있으며, 아마도 현재 Windows 플랫폼에서 제일 많이 사용하는 설치 툴일 걸로 예상된다.

초기 버전은 프로그램의 데이터를 설치파일로 묶기 위해서 DeflateBzip2압축 알고리즘만을 사용하였지만, 2.0버전부터는 LZMA를 지원하기 시작하면서, 설치파일의 크기를 많이 줄이는데 일조하였다.

2013년부터 공개된 3.0 버전은 유니코드를 지원하기 시작하였다.

간혹 설치 프로그램을 실행했을 때 NSIS Error가 뜨는 경우가 있는데, 이는 NSIS로 제작된 설치 프로그램이 깨져서 실행하지 못했다는 뜻이다. 즉 해당 설치파일은 손상되었으니 다시 다운받아야 된다는 것.

2. 소스 코드

  • SetOutPath [경로]
    파일이 처리될 경로를 설정한다. 예를 들어, $USERPROFILE\Desktop 으로 설정하면, File 을 통한 파일 압축해제는 바탕화면으로 이루어진다.
  • File [파일명]
    설치파일 안에 파일을 넣는코드이다. SetOutPath를 통해 설정한 경로로 파일이 풀린다.
  • DetailPrint [내용]
    설치 과정 중에 [내용]을 표시시킨다.
  • RMDir /r [경로]
    [경로] 자체를 지운다.
  • Delete [경로\파일]
    [경로\파일]을 지운다.
  • Copyfiles [경로1] [경로2]
    [경로1]의 파일을 [경로2]로 옮긴다.

2.1. 코드 예제

;는 NSIS상에서와 같이 주석으로 취급함. 각 코드를 설명하는 주석은 빨간색 처리, 스크립트 마법사에서 자동으로 만들어진 주석은 초록색 처리
아래 예제는 커스텀 폼을 연결한 것이다.
!define PRODUCT_NAME "예제"
!define PRODUCT_VERSION "1"
!define PRODUCT_PUBLISHER "제작자"
!define PRODUCT_WEB_SITE "제작자 웹사이트"

SetCompressor lzma

; MUI 1.67 compatible ------
!include "MUI.nsh"
!include "LogicLib.nsh"

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "icon.ico" ;icon.ico를 아이콘으로 설정한다.
BrandingText "텍스트" ;"텍스트"를 하단에 표기한다.

!define MUI_WELCOMEFINISHPAGE_BITMAP "File.bmp"
;File.bmp라는 비트맵 이미지를 제일 처음 WelcomePage 사이드에 추가한다.
; Welcome page
!insertmacro MUI_PAGE_WELCOME
!define MUI_PAGE_HEADER_TEXT "텍스트" ;헤더 텍스트
!define MUI_PAGE_HEADER_SUBTEXT "텍스트" ;서브헤더 텍스트
; License page
!insertmacro MUI_PAGE_LICENSE "License.txt" ;License.txt 파일을 라이선스페이지에 표시한다.
; Directory page
!insertmacro MUI_PAGE_DIRECTORY ;설치 경로를 설정하는 페이지.
; Install Setting page
Page Custom Form ;적용한 커스텀 폼을 이용한다.
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES ;파일을 설치한다.
; Finish page
!insertmacro MUI_PAGE_FINISH ;완료되고 난 다음 표기되는 마지막 페이지

; Language files
!insertmacro MUI_LANGUAGE "Korean"

; Reserve files
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS

; MUI end ------

Var 'var' ;함수 var를 추가한다.

ReserveFile "Form.ini" ;Form.ini 파일을 연동한다. 이때 ini파일은 커스텀 페이지.
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS

Function .onInit
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "Form.ini" ;커스텀 페이지를 임시로 압축을 해제한다.
FunctionEnd

Function Form
!insertmacro MUI_INSTALLOPTIONS_DISPLAY_RETURN "Form.ini" ;커스텀 페이지를 반환한다.
FunctionEnd


Name "파일의 이름"
OutFile "출력될 파일의 이름.exe"
InstallDir "경로" ;이때 환경변수 이용이 가능하며, 윈도우와 달리 $를 붙인다. NSIS만의 환경변수도 존재하는듯 하다.
ShowInstDetails show ;설치 과정중 자세히 보여줄 것인지를 결정한다. show와 hide, nevershow가 있다.
SetOverwrite ifnewer

Section "MainSection" SEC01
SetOutPath "$INSTDIR/Deleteme" ;경로를 설정한다.
File "javakill.cmd" ;파일을 스크립트에 넣고 "경로1"에 푼다.
DetailPrint "다음 프로세스를 정지합니다: Javaw.exe" ;"다음 프로세스를 정지합니다: Javaw.exe"를 설치 과정중에 표시한다.
nsExec::Exec "javakill.cmd" ;"경로1"에 있는 "javakill.cmd"를 실행한다.
goto Step1 ;Step1으로 간다. 배치파일과 비슷한 개념.
Step1:
!insertmacro MUI_INSTALLOPTIONS_READ "$Var" "Form.ini" "Field 1" "State" ;"Form.ini"의 1번 필드의 값을 Var함수로 가져온다.
StrCmp $Var "1" CheckA1 CheckA2 ;C/C++의 StrCmp와 같은 개념
CheckA1:
RMDir /r "$INSTDIR/Deleteme" ;폴더 및 하위 폴더와 파일을 제거한다.
goto Step2
CheckA2:
goto Step2
Step2:
SetOutPath "$INSTDIR/Temp"
DetailPrint "파일 다운로드중..."
Nsisdl::download "파일 직접링크" "다운로드될 파일의 이름" ;파일을 다운로드한다.
DetailPrint "적용중..."
File "7za.exe" ;7zip 라이브러리 파일(7za.exe)을 컴퓨터에 추가한다.
File "Extract.cmd" ;"Extract.cmd"파일을 컴퓨터에 추가한다.
nsExec::Exec "Extract.cmd" ;"Extract.cmd"파일을 실행한다.
DetailPrint "임시파일을 삭제하는중...."
RMDir /r "$INSTDIR/Temp" ;여기서는 임시파일이 제거된다.
DetailPrint "완료"
SectionEnd

Section -Post
SectionEnd

3. 플러그인

NSIS는 다양한 플러그인을 지원한다. 자체적으로 포함된 플러그인도 있으며 나머지 플러그인은 여기서 확인할수 있다.
기본적으로 플러그인용 코드는 플러그인 이름::명령어 로 설정된다.

3.1. 기본 플러그인

NSIS를 설치할 때 기본적으로 제공되는 플러그인들이다.
  • nsExec
    nsExec::Exec [경로] 로 해당 경로의 파일을 실행시킬수 있다.
  • NSISdl
    NSISdl::download [다운로드 링크] 로 해당 링크와 연결된 파일을 받을수 있다.
  • advsplash
    설치기 시작 함수(.onInit)에 넣으면 설치기를 실행할때 스플래시 이미지가 뜬다.