一句话:Nullsoft 出身的老牌开源 Windows 安装包制作工具——脚本驱动、极小引导体积、高度可编程,是 electron-builder 等主流打包链的 Windows 默认底座。

出身与现状

  • Nullsoft(Winamp 母公司,Justin Frankel 团队)2000 年前后开源,最初目标是给 Winamp 这类”几 MB 的程序 + 互联网分发”做安装器,所以核心设计目标是小和可控
  • 开发托管在 SourceForge(nsis.sourceforge.io),GitHub 上的 nsis-dev/nsis 只是镜像(约 0.9k stars,不代表项目热度)
  • 许可证:zlib/libpng,商用无附加条件
  • 用户面广:Vulkan Runtime、大量游戏/驱动/工具的安装器都是 NSIS 产物

工作原理

.nsi 脚本 ──makensis 编译──> 单个 .exe 安装程序
                              │
                              ├─ 极小 stub(引导程序,几十 KB)
                              ├─ 压缩数据区(LZMA / bzip2 / zlib)
                              └─ 运行时脚本解释器(安装逻辑按 .nsi 执行)

要点:

  • 产物是单文件 exe:自解压 + 自运行,无运行时依赖,可绿色分发
  • 安装逻辑全在脚本里:文件释放、注册表、快捷方式、服务、卸载器、条件判断都由 .nsi 声明,编译期确定
  • stub 体积极小,是它相对其他方案的传统优势之一

最小示例

!include "MUI2.nsh"            ; Modern UI 2 标准向导界面
 
Name "MyApp"
OutFile "MyApp-Setup.exe"
InstallDir "$PROGRAMFILES\MyApp"
RequestExecutionLevel admin      ; UAC 提权声明(也可 user 做 per-user 安装)
 
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "SimpChinese"
 
Section
  SetOutPath $INSTDIR
  File /r "dist\*.*"
  WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd
 
Section "Uninstall"
  RMDir /r "$INSTDIR"
SectionEnd

构建:makensis MyApp.nsi,静默安装用产物 MyApp-Setup.exe /S。

核心能力

  • 脚本语言:类汇编的专有脚本(变量/函数/宏/!include/!ifdef),配套 LogicLib、FileFunc、TextFunc 等标准库
  • UI 框架:MUI2(Modern UI 2)提供标准向导页面;nsDialogs 可完全自定义页面
  • 压缩:LZMA / LZMA solid / bzip2 / zlib 可选
  • UAC 与权限:RequestExecutionLevel admin|user,原生支持 per-user($LOCALAPPDATA)与全局($PROGRAMFILES)双模式
  • 静默安装:/S 内置支持,$0 传参(${GetParameters} 解析),CI/CD 与企业批量部署友好
  • 卸载器:WriteUninstaller 生成配套卸载程序,卸载逻辑同样可脚本化
  • 多语言:内置语言文件体系,单安装包可做多语言切换

插件生态

  • Plugin API:C/C++ 写 DLL 扩展,官方 + 社区插件数百个(网络下载、注册表增强、进程控制、自定义控件等)
  • 常用官方库:nsDialogs(自定义对话框)、NSISdl / INetC(下载)、System(Win32 API 调用)、ExecDos
  • 第三方典型:nsisunz、AccessControl、UAC(提权辅助)等
  • 生态成熟但风格偏老,新需求常需自己写 DLL

版本与安全历史

版本时间备注
3.02016大版本:Unicode 运行时、长字符串、64 位支持完善
3.092023-07修 CVE-2023-37378(插件目录 DLL 劫持)
3.102024Windows/ARM64 检测改进
3.112025-04修 CVE-2025-43715(%WINDIR%\temp 插件目录竞争条件提权到 SYSTEM)
3.122026 上半年修 CVE-2026-42171,当前最新

教训:历史 CVE 集中在插件临时目录的权限处理上。生产建议:使用最新版编译,签名产物,企业内分发优先走受控渠道。

在 Electron 生态中的位置

  • electron-builder 的 Windows 默认 target 就是 NSIS:target: [nsis],可配 oneClick / allowToChangeInstallationDirectory / 图标 / 签名
  • electron-updater 的 Windows 差量更新:NSIS 产物 + *.blockmap 文件配合实现增量下载
  • electron-builder 会自行下载 NSIS 二进制,国内需配 ELECTRON_BUILDER_BINARIES_MIRROR(见 07-environment-variables)

局限

  • 仅 Windows;macOS/Linux 分发要另选方案(见 nsis-vs-alternatives)
  • 脚本语言风格古老,学习曲线比 Inno Setup 陡,调试靠 DetailPrint + LogSet
  • 插件生态活跃但碎片化,部分插件年久失修
  • 产物是 EXE 而非 MSI,企业 GPO/SCCM 强制 MSI 场景不适用(可搭配 msi 工具链,但非原生路径)

适用场景

  • 桌面软件(尤其 Electron)需要完全控制安装流程与体积
  • 需要 per-user 安装、自定义安装步骤、多语言向导
  • CI/CD 中无人值守出包(makensis 纯命令行)

相关

  • README — Windows 安装包技术总览
  • nsis-vs-alternatives — 与 Inno Setup / WiX / Squirrel / Velopack / InstallShield 对比
  • electron-builder — NSIS 的最大下游使用者