使用 NSIS 制作 Windows 安装程序

介绍

NSIS 是一款老牌专业开源软件,用来制作 Windows 安装程序。它可以实现程序的安装、卸载、系统设置、文件提取等功能。因为它是基于脚本语言,所以您可以完全控制安装程序的每个部分。

NSIS 脚本语言支持变量、函数和字符串操作,就像普通编程语言一样 - 但专为创建安装程序而设计。即使具有所有这些功能,NSIS 仍然是最小的安装程序系统。使用默认选项时,它的开销仅为 34 KB。

特征

  • 开销很小(小于 40kb)
  • 强大的脚本语言
  • 易于使用,支持各种功能,如自定义界面、卸载程序、创建桌面快捷方式等
  • 支持多语言
  • 独特的压缩选项(zlib,bzip2,lzma)

安装 NSIS

NSIS 下载地址 下载 NSIS 安装程序,安装完成后默认会安装到 C:\\Program Files (x86)\\NSIS。需要将这个目录添加进 PATH 里,以便使用 makensis.exe 执行 nsi 脚本。

install

install2

创建 NSIS 安装程序

创建一个 NSIS 安装程序的过程包含三个主要步骤:

  1. 编写 .nsi 脚本文件;
  2. 使用 makensis 编译脚本文件,makensis nsis.nsi
  3. 运行生成的 .exe 安装程序;

以下是一个示例脚本文件:

;--------------------------------
; 常规属性
;--------------------------------
Name "My Application"
OutFile "MyApplication Setup.exe"
InstallDir "$PROGRAMFILES\my_application"

;--------------------------------
; 定义界面
;--------------------------------
!include "MUI2.nsh"

;--------------------------------
; 定义安装过程
;--------------------------------
; 安装目录选择页面
!insertmacro MUI_PAGE_DIRECTORY
; 安装过程页面
!insertmacro MUI_PAGE_INSTFILES
; 安装完成页面
!insertmacro MUI_PAGE_FINISH

; 卸载过程页面
!insertmacro MUI_UNPAGE_CONFIRM
; 卸载完成页面
!insertmacro MUI_UNPAGE_INSTFILES

;--------------------------------
; 定义安装区段
;--------------------------------
Section "MainSection" SEC01
    SetOutPath $INSTDIR
    File "MyApplication.exe"
SectionEnd

;--------------------------------
; 定义卸载区段
;--------------------------------
Section "Uninstall" SEC02
    Delete $INSTDIR\\MyApplication.exe
    RMDir $INSTDIR
SectionEnd

示例脚本说明:

常规属性:

Name 定义程序名称;

OutFile NSIS 输出文件,也就是安装文件的输出路径;

InstallDir 安装目录;

定义界面:引入新界面样式的头文件;

定义安装过程:安装过程有两种,安装过程和卸载过程;

区段 (Section) :

安装时可能要选择安装多个组件,区段就是定义组件的安装文件和逻辑;

安装区段:安装区段的名字定义相对随意,除了卸载区段的名称限制其他的都是安装区段;

卸载区段:卸载区段的名字限制:前缀为 un. 或者名字是 Uninstall 的区段;

常量:

$PROGRAMFILES:程序目录;

变量:

$INSTDIR :安装目录;

脚本还有很多功能,可以查看手册:

下载中文版 NSIS.chm

其他示例

; 基本信息
!define APP_NAME "doghead-tool"
!define APP_LNK_NAME "狗头工具"
!define APP_VERSION "1.0.0"
 
; 新版 UI 2.0
!include "MUI2.nsh"
; 新版安装和卸载图标
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\orange-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\orange-uninstall.ico"
; 基础信息
Name ${APP_NAME}
OutFile "${APP_LNK_NAME} ${APP_VERSION} Setup.exe"
InstallDir "$PROGRAMFILES\${APP_NAME}"

; 安装完成后运行程序
!define MUI_FINISHPAGE_RUN "$INSTDIR\${APP_NAME}.exe"
!define MUI_FINISHPAGE_RUN_NOTCHECKED
; 安装完成后显示信息
!define MUI_FINISHPAGE_LINK "访问 rockrabbit 网站"
!define MUI_FINISHPAGE_LINK_LOCATION "https://www.68wu.cn"

; 安装目录选择页面
!insertmacro MUI_PAGE_DIRECTORY
; 安装过程页面
!insertmacro MUI_PAGE_INSTFILES
; 安装完成页面
!insertmacro MUI_PAGE_FINISH
; 卸载过程页面
!insertmacro MUI_UNPAGE_CONFIRM
; 卸载完成页面
!insertmacro MUI_UNPAGE_INSTFILES

; 定义语言
!insertmacro MUI_LANGUAGE "SimpChinese"

; 文件打包
Section MainSetup
  SetOutPath $INSTDIR
  File "doghead-tool.exe"
  File "app.ico"
  ;创建注册信息
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "DisplayName" "${APP_NAME}"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "DisplayVersion" "${APP_VERSION}"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "Publisher" "rockrabbit"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "UninstallString" "$\"$INSTDIR\Uninstall.exe$\""
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "InstallLocation" "$INSTDIR"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "DisplayIcon" "$INSTDIR\app.ico"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "HelpLink" "https://www.68wu.cn"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "URLInfoAbout" "https://www.68wu.cn"

  ;创建菜单快捷方式
  CreateDirectory "$SMPROGRAMS\${APP_NAME}"
  CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_LNK_NAME}.lnk" "$INSTDIR\${APP_NAME}.exe"
  CreateShortCut "$STARTMENU\${APP_NAME}\${APP_LNK_NAME}.lnk" "$INSTDIR\${APP_NAME}.exe"
  ;卸载程序
  WriteUninstaller "$INSTDIR\Uninstall.exe"
  ;创建桌面快捷方式
  CreateShortCut "$DESKTOP\${APP_LNK_NAME}.lnk" "$INSTDIR\${APP_NAME}.exe"
SectionEnd

; 卸载程序
Section Uninstall
  ;删除安装目录
  RMDir /r "$INSTDIR"
  ;删除桌面快捷方式
  Delete "$DESKTOP\${APP_LNK_NAME}.lnk"
  ;删除注册信息
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}"
  ;删除菜单快捷方式
  Delete "$SMPROGRAMS\${APP_NAME}\${APP_LNK_NAME}.lnk"
  Delete "$STARTMENU\${APP_NAME}\${APP_LNK_NAME}.lnk"
  RMDir /r "$SMPROGRAMS\${APP_NAME}"
SectionEnd