====== NSIS ======
> Make Install Package using Nullsoft Install System.
===== Setting Environment =====
- NSIS Install; Nullsoft Install System을 설치한다.
- HM NIS Edit Install; HM NIS Edit를 설치한다
- Install Plugins; 아래 플러그인을 NSIS 설치한 위치의 Plugins 디렉토리로 복사한다.
* EnVar-Plugin
* Nsis7z plug-in
===== Preparing Files =====
* 설치 패키지를 위한 파일을 준비한다. (ustra.7z = VSCode + STS4 + git + node.js + yarn + ..., ustra.ico)
* NSIS Script file; 설치 패키지를 만드는 스크립트, *.nsi (ustra-dev-tools.nsi)
* Prepare files to install; 설치할 파일을 준비한다.
* make 7z file into Input directory; 생성한 ustra.7z 파일을 Input 디렉토리에 넣는다.
├─tools
│ ├─apache-maven-3.8.1
│ ├─gradle-6.9.2
│ ├─java
│ │ └─java-1.8.0-openjdk-1.8.0.212-1
│ ├─sts-4.7.1
│ ├─VSCode-win32-x64-1.48.0
│ ├─Git-2.37.0-64-bit.exe
│ ├─node-v12.22.9-x64.msi
│ └─yarn-1.22.19.msi
└─workspace
* Create Output Directory; 설치 패키지의 최종 결과 파일을 저장할 디렉토리를 생성한다.
* Structures; 설치 패키지를 위한 디렉토리 구조는 아래와 같다.
└─*.nsi
├─Input
| ├─ustra.ico
│ └─ustra.7z
└─Output
└─executable setup file will be here.
===== Scripts =====
* HM NIS Edit 를 실행한다. \\ {{:public:computer:2022-07-20_14_30_27.gif|}}
* 스크립트를 작성하거나 작성된 스크립트 파일을 연다. \\ {{:public:computer:2022-07-20_14_02_31-cut2.gif|}}
; Script generated by the HM NIS Edit Script Wizard.
; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "U.STRA Framework 개발 환경"
!define PRODUCT_VERSION "0.1"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
; MUI 1.67 compatible ------
!include "MUI.nsh"
; MUI Settings
!define MUI_ABORTWARNING
;!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_ICON ".\Input\ustra.ico"
;!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"
!define MUI_UNICON ".\Input\ustra.ico"
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
;!define MUI_FINISHPAGE_NOAUTOCLOSE
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
!insertmacro MUI_LANGUAGE "Korean"
; MUI end ------
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile ".\Output\Setup_UStra_Dev.exe"
;InstallDir "$PROGRAMFILES\U.STRA Framework 개발 환경"
InstallDir "C:\ustra_devtools"
ShowInstDetails show
ShowUnInstDetails show
; Global Variables --------
Var fileSTS4Ini
Var fileGitInstaller
Var fileNodejsInstaller
Var fileYarnInstaller
Function InitInstallers
StrCpy $fileSTS4Ini "$INSTDIR\tools\sts-4.7.1\SpringToolSuite4.ini"
StrCpy $fileGitInstaller "$INSTDIR\tools\Git-2.37.0-64-bit.exe"
StrCpy $fileNodejsInstaller "$INSTDIR\tools\node-v12.22.9-x64.msi"
StrCpy $fileYarnInstaller "$INSTDIR\tools\yarn-1.22.19.msi"
FunctionEnd
Function WriteSTS4IniFile
; Write SpringToolSuite4.ini file
;FileOpen $9 $INSTDIR\tools\sts-4.7.1\SpringToolSuite4.ini w ; Opens a Empty File and fills it
FileOpen $9 $fileSTS4Ini w ; Opens a Empty File and fills it
FileWrite $9 "-startup$\r$\n\
plugins/org.eclipse.equinox.launcher_1.5.700.v20200207-2156.jar$\r$\n\
--launcher.library$\r$\n\
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.1200.v20200508-1552$\r$\n\
-product$\r$\n\
org.springframework.boot.ide.branding.sts4$\r$\n\
--launcher.defaultAction$\r$\n\
openFile$\r$\n\
-vm$\r$\n\
$INSTDIR\tools\java\java-1.8.0-openjdk-1.8.0.212-1\bin\javaw.exe$\r$\n\
-vmargs$\r$\n\
-Dosgi.requiredJavaVersion=1.8$\r$\n\
-Dosgi.dataAreaRequiresExplicitInit=true$\r$\n\
-Xms256m$\r$\n-Xmx2048m$\r$\n\
--add-modules=ALL-SYSTEM$\r$\n\
-javaagent:$INSTDIR\tools\sts-4.7.1\lombok.jar$\r$\n\
-Dfile.encoding=UTF-8$\r$\n"
FileClose $9 ; Closes the filled file
FunctionEnd
Function AddEnvironmentVariablesInHKCU
; add Environment Variables
EnVar::Check "temp" "NULL"
Pop $0
DetailPrint "EnVar::Check temp:NULL returned=|$0|"
; JAVA_HOME
EnVar::AddValue "JAVA_HOME" "$INSTDIR\tools\java\java-1.8.0-openjdk-1.8.0.212-1"
Pop $0
DetailPrint "EnVar::AddValue JAVA_HOME returned=|$0|"
; GRADLE_HOME
EnVar::AddValue "GRADLE_HOME" "$INSTDIR\tools\gradle-6.9.2"
Pop $0
DetailPrint "EnVar::AddValue GRADLE_HOME returned=|$0|"
; MAVEN_HOME
EnVar::AddValue "MAVEN_HOME" "$INSTDIR\tools\apache-maven-3.8.1"
Pop $0
DetailPrint "EnVar::AddValue MAVEN_HOME returned=|$0|"
FunctionEnd
Function AddPathsInHKCU
; add Paths
EnVar::AddValueEx "Path" "%JAVA_HOME%\bin"
Pop $0
DetailPrint "EnVar::AddValue Path %JAVA_HOME%\bin = |$0|"
EnVar::AddValueEx "Path" "%GRADLE_HOME%\bin"
Pop $0
DetailPrint "EnVar::AddValue Path %GRADLE_HOME%\bin = |$0|"
EnVar::AddValueEx "Path" "%MAVEN_HOME%\bin"
Pop $0
DetailPrint "EnVar::AddValue Path %MAVEN_HOME%\bin = |$0|"
;DetailPrint "EnVar::Update HKLM JAVA_HOME returned=|$0|"
;EnVar::Check "NULL" "NULL"
;Pop $0
;DetailPrint "EnVar::Check write access HKCU returned=|$0|"
FunctionEnd
Function InstallGit
; Install git
; ExecWait "$INSTDIR\tools\Git-2.36.1-64-bit.exe"
ExecWait $fileGitInstaller ;"$INSTDIR\tools\Git-2.37.0-64-bit.exe"
FunctionEnd
Function InstallNodejs
; Install Node.js v12.22.9
ReadRegStr $R0 HKLM "SOFTWARE\Node.js" "Version"
${If} $R0 == ""
;ExecWait 'C:\Windows\SysWOW64\msiexec.exe /i "$INSTDIR\tools\node-v12.22.9-x64.msi"'
ExecWait 'C:\Windows\SysWOW64\msiexec.exe /i $fileNodejsInstaller'
${Else}
${If} $R0 == "12.22.9"
; already installed, skip this step
${Else}
; uninstall different version and install v12.22.9 version
ExecWait "C:\Windows\SysWOW64\msiexec.exe /x {C1B586E6-C075-42F3-B7E4-0DE4222DEEC0}"
;ExecWait 'C:\Windows\SysWOW64\msiexec.exe i "$INSTDIR\tools\node-v12.22.9-x64.msi"'
ExecWait 'C:\Windows\SysWOW64\msiexec.exe i $fileNodejsInstaller'
${EndIf}
${EndIf}
FunctionEnd
Function InstallYarn
; Install Yarn
; ExecWait 'C:\Windows\SysWOW64\msiexec.exe /i "$INSTDIR\tools\yarn-1.22.4.msi"'
ExecWait 'C:\Windows\SysWOW64\msiexec.exe /i $fileYarnInstaller'
FunctionEnd
Function CreateDesktopShortcuts
; Create Desktop Shortcuts
CreateShortCut "$DESKTOP\U.STRA Framework 개발 환경 - VSCODE.lnk" "$INSTDIR\tools\VSCode-win32-x64-1.48.0\Code.exe"
CreateShortCut "$DESKTOP\U.STRA Framework 개발 환경 - STS.lnk" "$INSTDIR\tools\sts-4.7.1\SpringToolSuite4.exe" "-data $INSTDIR\workspace"
FunctionEnd
Section "MainSection" SEC01
SetOutPath "$INSTDIR"
SetOverwrite ifnewer
File ".\Input\ustra.7z"
; First above all, Extract Compressed file
Nsis7z::ExtractWithDetails "$INSTDIR\ustra.7z" "Unpacking %s..."
; Set Variables to Install
Call InitInstallers
; Set SpringToolSuite4.ini File
Call WriteSTS4IniFile
; Install Utilities
; Install Node.js
Call InstallNodejs
; Install Yarn
Call InstallYarn
; Install Git
Call InstallGit
; Set Environment Variables, HKEY_CURRENT_USER
; Add Environment Values; JAVA_HOME, GRADLE_HOME, MAVEN_HOME
Call AddEnvironmentVariablesInHKCU
; Add Paths; %JAVA_HOME%\bin, %GRADLE_HOME%\bin, %MAVEN_HOME%\bin
Call AddPathsInHKCU
; Create Desktop Shortcuts for VSCode, STS4
Call CreateDesktopShortcuts
; When installation completed, delete compressed file
Delete "$INSTDIR\ustra.7z"
SectionEnd
Section -AdditionalIcons
CreateDirectory "$SMPROGRAMS\U.STRA Framework 개발 환경"
CreateShortCut "$SMPROGRAMS\U.STRA Framework 개발 환경\Uninstall.lnk" "$INSTDIR\uninst.exe"
SectionEnd
Section -Post
WriteUninstaller "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
SectionEnd
Function un.onUninstSuccess
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "$(^Name)는(은) 완전히 제거되었습니다."
FunctionEnd
Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(^Name)을(를) 제거하시겠습니까?" IDYES +2
Abort
FunctionEnd
Section Uninstall
; Delete "$INSTDIR\uninst.exe"
; Delete "$INSTDIR\ustra.7z"
; Delete "$INSTDIR\tools\sts-4.7.1\SpringToolSuite4.ini"
; Delete environment variables
; JAVA_HOME
;EnVar::Delete "JAVA_HOME"
EnVar::DeleteValue "JAVA_HOME" "$INSTDIR\tools\java\java-1.8.0-openjdk-1.8.0.212-1"
; GRADLE_HOME
;EnVar::Delete "GRADLE_HOME"
EnVar::DeleteValue "GRADLE_HOME" "$INSTDIR\tools\gradle-6.9.2"
; MAVEN_HOME
;EnVar::Delete "MAVEN_HOME"
EnVar::DeleteValue "MAVEN_HOME" "$INSTDIR\tools\apache-maven-3.8.1"
EnVar::Delete ""
; Delete Path
EnVar::DeleteValue "Path" "%JAVA_HOME%\bin"
EnVar::DeleteValue "Path" "%GRADLE_HOME%\bin"
EnVar::DeleteValue "Path" "%MAVEN_HOME%\bin"
Delete "$SMPROGRAMS\U.STRA Framework 개발 환경\Uninstall.lnk"
Delete "$DESKTOP\U.STRA Framework 개발 환경 - VSCODE.lnk"
Delete "$DESKTOP\U.STRA Framework 개발 환경 - STS.lnk"
RMDir "$SMPROGRAMS\U.STRA Framework 개발 환경"
RMDir /r "$INSTDIR"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
SetAutoClose true
SectionEnd
===== Build & Test =====
* Build; 작성한 스크립트를 빌드한다. 오류가 없으면 설치 파일이 생성된다. \\ {{:public:computer:hmnisedit_000_script_compile.png?500|}}{{:public:computer:hmnisedit_001_compile_result.png?500|}}
* Test on Windows
* 설치 테스트를 위한 Windows 운영체제를 준비한다; 포맷 후 Windows만 설치한 PC 혹은 Hyper-V, VMWare, Virtual Box 등의 가상 머신에 Windows 설치. (가능한 한 응용 프로그램을 설치하지 않은 Windows 운영체제를 추천)
* 준비한 Windows 운영체제에 빌드한 설치 파일을 복사한다.
* 설치 파일을 이용하여 프로그램을 설치한다.
* 설치한 프로그램 동작을 확인한다.
* SpringToolSuite4
* VSCode
* Node.js
* Yarn
* Git
* 시스템 환경 변수 편집 혹은 CMD 등에서 환경 설정 내용을 확인한다; JAVA_HOME, GRADLE_HOME, MAVEN_HOME, Path
* 확인 후 의도한 대로 설치되지 않았으면 스크립트 수정 후 빌드 -> 테스트를 다시 진행하고, 의도한 대로 설치되었다면 다른 Windows 시스템에도 테스트 진행하여 확인한다. 다시 테스트를 진행하기 전에 반드시 이전 설치 및 설정된 내역을 리셋한다. (Uninstall, Windows 복귀 등)
* 확인이 완료되면 배포한다.
===== References =====
* 개발 환경 및 관련 리소스는 아래의 링크에서 확인할 수 있다.
* [[https://nsis.sourceforge.io/Download|NSIS Download]]
* [[https://nsis.sourceforge.io/Docs/|NSIS Users Manual]]
* [[https://nsis.sourceforge.io/Wiki/|NSIS Wiki]]
* [[http://hmne.sourceforge.net/|HM NIS EDIT: A Free NSIS Editor/IDE]]
* [[https://nsis.sourceforge.io/Nsis7z_plug-in|Nsis7z_plguin]]
* [[https://github.com/GsNSIS/EnVar|EvVar Plugin for NSIS]]
* [[https://opentutorials.org/module/3650/21851|NSIS 사용자 설명서 @opentutorials.org]]
* {{:public:computer:2022-07-20_14_02_31.gif?200|}}{{:public:computer:2022-07-20_14_02_31-cut.gif?200|}}