[목차] == 개요 == '''N'''ullsoft '''S'''criptable '''I'''nstall '''S'''ystem Windows용 오픈소스 설치(Setup) 프로그램 제작 툴 [[http://nsis.sourceforge.net/|홈페이지]] 원래 [[Winamp]]를 만든 Nullsoft의 [[저스틴 프랑켈]]이 Winamp의 설치프로그램을 만들기 위해서 만든 제작툴을 2001년 [[https://github.com/NSIS-Dev|오픈소스로 공개한 것]]이 이후 여러 개발자에 의해서 업데이트 되고 있다. NSIS가 처음 공개된 2001년에는 인스톨 쉴드와 같은 상업적인 설치 프로그램 개발 툴만이 존재하고 있었는데, 인스톨 쉴드는 무겁다는 단점이 있었다. NSIS가 공개된 이후 수많은 상용 소프트웨어 및 오픈소스 프로젝트에서 NSIS를 사용하고 있으며, 아마도 현재 Windows 플랫폼에서 제일 많이 사용하는 설치 툴일 걸로 예상된다. 초기 버전은 프로그램의 데이터를 설치파일로 묶기 위해서 [[Deflate]]와 [[Bzip2]]압축 알고리즘만을 사용하였지만, 2.0버전부터는 [[LZMA]]를 지원하기 시작하면서, 설치파일의 크기를 많이 줄이는데 일조하였다. 2013년부터 공개된 3.0 버전은 유니코드를 지원하기 시작하였다. 간혹 설치 프로그램을 실행했을 때 NSIS Error가 뜨는 경우가 있는데, 이는 NSIS로 제작된 설치 프로그램이 깨져서 실행하지 못했다는 뜻이다. 즉 해당 설치파일은 손상되었으니 다시 다운받아야 된다는 것. == 소스 코드 == * SetOutPath [경로] 파일이 처리될 경로를 설정한다. 예를 들어, $USERPROFILE\Desktop 으로 설정하면, File 을 통한 파일 압축해제는 바탕화면으로 이루어진다. * File [파일명] 설치파일 안에 파일을 넣는코드이다. SetOutPath를 통해 설정한 경로로 파일이 풀린다. * DetailPrint [내용] 설치 과정 중에 [내용]을 표시시킨다. * RMDir /r [경로] [경로] 자체를 지운다. * Delete [경로\파일] [경로\파일]을 지운다. * Copyfiles [경로1] [경로2] [경로1]의 파일을 [경로2]로 옮긴다. === 코드 예제 === ;는 NSIS상에서와 같이 주석으로 취급함. 각 코드를 설명하는 주석은 {{{#red 빨간색}}} 처리, 스크립트 마법사에서 자동으로 만들어진 주석은 {{{#green 초록색}}} 처리 아래 예제는 커스텀 폼을 연결한 것이다. ||!define PRODUCT_NAME "예제" !define PRODUCT_VERSION "1" !define PRODUCT_PUBLISHER "제작자" !define PRODUCT_WEB_SITE "제작자 웹사이트" SetCompressor lzma {{{#green ; MUI 1.67 compatible ------}}} !include "MUI.nsh" !include "LogicLib.nsh" {{{#green ; MUI Settings}}} !define MUI_ABORTWARNING !define MUI_ICON "icon.ico" {{{#red ;icon.ico를 아이콘으로 설정한다.}}} BrandingText "텍스트" {{{#red ;"텍스트"를 하단에 표기한다.}}} !define MUI_WELCOMEFINISHPAGE_BITMAP "File.bmp" {{{#red ;File.bmp라는 비트맵 이미지를 제일 처음 WelcomePage 사이드에 추가한다.}}} {{{#green ; Welcome page}}} !insertmacro MUI_PAGE_WELCOME !define MUI_PAGE_HEADER_TEXT "텍스트" {{{#red ;헤더 텍스트}}} !define MUI_PAGE_HEADER_SUBTEXT "텍스트" {{{#red ;서브헤더 텍스트}}} {{{#green ; License page}}} !insertmacro MUI_PAGE_LICENSE "License.txt" {{{#red ;License.txt 파일을 라이선스페이지에 표시한다.}}} {{{#green ; Directory page}}} !insertmacro MUI_PAGE_DIRECTORY {{{#red ;설치 경로를 설정하는 페이지.}}} {{{#green ; Install Setting page}}} Page Custom Form {{{#red ;적용한 커스텀 폼을 이용한다.}}} {{{#green ; Instfiles page}}} !insertmacro MUI_PAGE_INSTFILES {{{#red ;파일을 설치한다.}}} {{{#green ; Finish page}}} !insertmacro MUI_PAGE_FINISH {{{#red ;완료되고 난 다음 표기되는 마지막 페이지}}} {{{#green ; Language files}}} !insertmacro MUI_LANGUAGE "Korean" {{{#green ; Reserve files}}} !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS {{{#green ; MUI end ------}}} Var 'var' {{{#red ;함수 var를 추가한다.}}} ReserveFile "Form.ini" {{{#red ;Form.ini 파일을 연동한다. 이때 ini파일은 커스텀 페이지.}}} !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS Function .onInit !insertmacro MUI_INSTALLOPTIONS_EXTRACT "Form.ini" {{{#red ;커스텀 페이지를 임시로 압축을 해제한다.}}} FunctionEnd Function Form !insertmacro MUI_INSTALLOPTIONS_DISPLAY_RETURN "Form.ini" {{{#red ;커스텀 페이지를 반환한다.}}} FunctionEnd Name "파일의 이름" OutFile "출력될 파일의 이름.exe" InstallDir "경로" {{{#red ;이때 환경변수 이용이 가능하며, 윈도우와 달리 $를 붙인다. NSIS만의 환경변수도 존재하는듯 하다.}}} ShowInstDetails show {{{#red ;설치 과정중 자세히 보여줄 것인지를 결정한다. show와 hide, nevershow가 있다.}}} SetOverwrite ifnewer Section "MainSection" SEC01 SetOutPath "$INSTDIR/Deleteme" {{{#red ;경로를 설정한다.}}} File "javakill.cmd" {{{#red ;파일을 스크립트에 넣고 "경로1"에 푼다.}}} DetailPrint "다음 프로세스를 정지합니다: Javaw.exe" {{{#red ;"다음 프로세스를 정지합니다: Javaw.exe"를 설치 과정중에 표시한다.}}} nsExec::Exec "javakill.cmd" {{{#red ;"경로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 {{{#red ;C/C++의 StrCmp와 같은 개념}}} CheckA1: RMDir /r "$INSTDIR/Deleteme" {{{#red ;폴더 및 하위 폴더와 파일을 제거한다.}}} goto Step2 CheckA2: goto Step2 Step2: SetOutPath "$INSTDIR/Temp" DetailPrint "파일 다운로드중..." Nsisdl::download "파일 직접링크" "다운로드될 파일의 이름" {{{#red ;파일을 다운로드한다.}}} DetailPrint "적용중..." File "7za.exe" {{{#red ;7zip 라이브러리 파일(7za.exe)을 컴퓨터에 추가한다.}}} File "Extract.cmd" {{{#red ;"Extract.cmd"파일을 컴퓨터에 추가한다.}}} nsExec::Exec "Extract.cmd" {{{#red ;"Extract.cmd"파일을 실행한다.}}} DetailPrint "임시파일을 삭제하는중...." RMDir /r "$INSTDIR/Temp" {{{#red ;여기서는 임시파일이 제거된다.}}} DetailPrint "완료" SectionEnd Section -Post SectionEnd|| == 플러그인 == NSIS는 다양한 플러그인을 지원한다. 자체적으로 포함된 플러그인도 있으며 나머지 플러그인은 [[http://nsis.sourceforge.net/Category:Plugins|여기서]] 확인할수 있다. 기본적으로 플러그인용 코드는 플러그인 이름::명령어 로 설정된다. === 기본 플러그인 === NSIS를 설치할 때 기본적으로 제공되는 플러그인들이다. * nsExec nsExec::Exec [경로] 로 해당 경로의 파일을 실행시킬수 있다. * NSISdl NSISdl::download [다운로드 링크] 로 해당 링크와 연결된 파일을 받을수 있다. * advsplash 설치기 시작 함수(.onInit)에 넣으면 설치기를 실행할때 스플래시 이미지가 뜬다. [[분류:프로그래밍 언어]]