본문 바로가기

Program

NSIS 고급 설치 스크립트 예제 분석 – Modern UI, 파일 내용 치환, 패치 설치 등

반응형

해당 링크는 NSIS (Nullsoft Scriptable Install System) 공식 사이트의 예제 스크립트 중 하나로, 여러 가지 유용한 기능들을 조합하여 설치 프로그램을 만드는 데 참고할 수 있는 고급 예시입니다.

이 문서에서 다루는 주요 기능들은 다음과 같습니다:


✅ 주요 기능 요약

1. replace_txt

설치 중 파일 내부의 특정 문자열을 다른 문자열로 교체하는 기능입니다.
예를 들어 설정 파일에서 {INSTALLDIR}을 실제 경로로 대체하는 데 유용합니다.

예시:

!include "TextFunc.nsh"
${ReplaceInFile} "$INSTDIR\config.txt" "{INSTALLDIR}" "$INSTDIR"

2. 상호 배제 (Mutually Exclusive Functions)

사용자가 체크박스 등으로 동시에 선택할 수 없는 항목들을 선택하지 못하도록 제어합니다.
예: "Lite 설치"와 "Full 설치"는 함께 선택할 수 없음

예시:

Function .onInit
    ; 예시 논리: Lite와 Full 설치는 동시에 체크 못 하게 제어
    ; 사용자가 잘못 선택했을 때 오류 메시지 출력
FunctionEnd

3. MUI (Modern UI) 사용

NSIS의 Modern UI 플러그인을 활용한 시각적으로 세련된 설치 마법사 UI 제공

!include "MUI2.nsh"

!define MUI_ABORTWARNING
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "license.txt"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

4. 패치 설치 (Patch Install)

기존 설치 경로에서 버전 정보를 읽고 이미 설치되어 있는 경우 업데이트 형식으로 진행할 수 있게 구성합니다.
예를 들어 버전 비교를 통해 덮어쓸지 말지를 판단하게 됩니다.

예시:

ReadRegStr $R0 HKLM "Software\MyApp" "InstallPath"
StrCmp $R0 "" 0 +2
Abort "이미 설치된 경로가 존재합니다. 패치 모드로 실행하세요."

5. 기타 유용한 함수 조합

  • Section과 Function을 조합하여 설치 흐름을 제어
  • MessageBox, IfFileExists 등을 활용한 예외 처리
  • Exec, ExecWait를 통해 외부 프로그램 실행

📁 예시 스크립트 구조 요약

!include "MUI2.nsh"
!include "TextFunc.nsh"

Name "My Cool App"
OutFile "MyAppSetup.exe"
InstallDir "$PROGRAMFILES\My Cool App"

!define MUI_ABORTWARNING

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "license.txt"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

Section "MainSection" SEC01
    SetOutPath "$INSTDIR"
    File "MyApp.exe"
    File "config.txt"
    ${ReplaceInFile} "$INSTDIR\config.txt" "{INSTALLDIR}" "$INSTDIR"
SectionEnd

💡 초보자를 위한 팁

  • NSIS 설치 방법: https://nsis.sourceforge.io/Download 에서 최신 버전을 받아 설치합니다.
  • NSIS로 설치파일 만들기: .nsi 확장자를 가진 스크립트를 작성한 후 NSIS 프로그램에서 Compile NSI scripts 기능을 사용하면 .exe 설치파일을 만들 수 있습니다.
  • MUI는 필수! - Modern UI를 쓰면 훨씬 예쁘고 직관적인 설치 마법사를 만들 수 있으므로 추천합니다.
  • 디버깅 팁: DetailPrint와 MessageBox로 변수 값을 출력하면 스크립트 흐름을 파악하기 쉬워집니다.

 

 

아래는 NSIS 예제 스크립트를 현업에 활용할 수 있도록 구체적으로 커스터마이징해서 설명드리겠습니다. 아래는 사용 사례를 가정하고, 해당 시나리오에 맞게 예제를 어떻게 수정하고 확장할 수 있는지를 단계별로 설명합니다.


✅ 사용 시나리오: "MyCoolApp" 설치 프로그램 만들기

  • 사용자에게 설치 디렉토리를 선택하게 함
  • 설치 전 기존 버전이 있는지 확인하고, 덮어쓰기 여부 묻기
  • config.txt의 {INSTALLDIR} 문자열을 실제 설치 경로로 대체
  • 설치 후 실행 파일 자동 실행
  • MUI 적용한 깔끔한 설치 UI

🧩 커스터마이징된 예제 코드

; NSIS 기본 및 Modern UI 포함
!include "MUI2.nsh"
!include "TextFunc.nsh" ; replace_txt 기능을 위한 include

; 기본 정보 정의
Name "MyCoolApp"
OutFile "MyCoolApp_Installer.exe"
InstallDir "$PROGRAMFILES\MyCoolApp"
InstallDirRegKey HKCU "Software\MyCoolApp" "InstallPath"
RequestExecutionLevel admin ; 관리자 권한 필요

; Modern UI 설정
!define MUI_ABORTWARNING
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "license.txt"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH

; 언어 설정
!insertmacro MUI_LANGUAGE "Korean"

; 설치 섹션 시작
Section "설치 (필수)" SEC01
    ; 설치 경로 확인 및 디렉터리 생성
    SetOutPath "$INSTDIR"

    ; 파일 복사
    File "MyCoolApp.exe"
    File "config.txt"

    ; 설정 파일 내부 문자열 치환
    ${ReplaceInFile} "$INSTDIR\config.txt" "{INSTALLDIR}" "$INSTDIR"

    ; 설치 경로를 레지스트리에 저장
    WriteRegStr HKCU "Software\MyCoolApp" "InstallPath" "$INSTDIR"
    WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd

; 설치 이후 실행
Section -post
    Exec "$INSTDIR\MyCoolApp.exe"
SectionEnd

; 제거 섹션
Section "제거" SEC02
    Delete "$INSTDIR\MyCoolApp.exe"
    Delete "$INSTDIR\config.txt"
    Delete "$INSTDIR\Uninstall.exe"
    DeleteRegKey HKCU "Software\MyCoolApp"
    RMDir "$INSTDIR"
SectionEnd

🔍 커스터마이징 포인트 상세 설명

1. InstallDirRegKey

  • 사용자가 한 번 설치한 이후에는 그 설치 경로를 기억해서 자동으로 선택됩니다.

2. RequestExecutionLevel admin

  • 프로그램을 시스템 디렉토리에 설치할 수 있도록 관리자 권한 요청을 추가합니다.

3. ${ReplaceInFile}

  • config.txt 파일에 {INSTALLDIR}을 $INSTDIR로 치환하여 실제 설치 경로가 반영됩니다.
  • TextFunc.nsh를 반드시 include 해야 사용 가능합니다.

4. Exec

  • 설치가 완료되면 프로그램을 자동으로 실행합니다.
  • ExecWait을 쓰면 사용자 입력이 끝날 때까지 기다릴 수도 있습니다.

5. Uninstall 기능

  • 사용자 제어판 > 프로그램 제거에서도 보일 수 있도록 제거 기능을 포함합니다.

✅ config.txt 예시 (템플릿용)

appPath={INSTALLDIR}
language=ko
logFile={INSTALLDIR}\logs\app.log

설치 시 다음과 같이 치환됩니다:

appPath=C:\Program Files\MyCoolApp
language=ko
logFile=C:\Program Files\MyCoolApp\logs\app.log

📎 설치 전 기존 버전 존재 여부 확인 추가 (고급)

Function .onInit
    ReadRegStr $R0 HKCU "Software\MyCoolApp" "InstallPath"
    StrCmp $R0 "" done

    MessageBox MB_YESNO|MB_ICONQUESTION \
        "기존 설치가 감지되었습니다. 덮어쓰시겠습니까?" IDYES done

    Abort "설치가 취소되었습니다."

done:
FunctionEnd

위 코드는 .onInit에서 레지스트리 확인 후, 기존 설치가 있으면 덮어쓸지 여부를 묻고, 아니면 설치를 중단합니다.


📎 Uninstall.exe 등록

아래를 추가하면 제어판 > 프로그램 추가/제거에 등록됩니다.

WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\MyCoolApp" "DisplayName" "MyCoolApp"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\MyCoolApp" "UninstallString" "$INSTDIR\Uninstall.exe"

🎯 커스터마이징 활용 팁

기능 설명 예시

DetailPrint 설치 로그 출력 DetailPrint "파일 복사 완료"
MessageBox 사용자에게 알림 MessageBox MB_OK "설치가 완료되었습니다."
IfFileExists 기존 파일 존재 여부 검사 IfFileExists "$INSTDIR\config.txt" 0 +2
ExecShell 특정 URL 열기 ExecShell "open" "https://mycoolapp.com"

🧵 마무리 정리: NSIS 예제를 커스터마이징하는 방법

  • 기본 제공 예제를 기반으로, 자신의 앱에 맞는 논리와 흐름으로 재작성하는 것이 핵심입니다.
  • Modern UI, 레지스트리 활용, 설정파일 치환, 자동 실행, 삭제 기능 등록까지 포함하면 상용 앱 수준의 설치기가 됩니다.
  • .nsi 파일만 잘 구성하면, 컴파일 한 번으로 .exe 설치 파일이 완성됩니다.
반응형