一句话: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.0 | 2016 | 大版本:Unicode 运行时、长字符串、64 位支持完善 |
| 3.09 | 2023-07 | 修 CVE-2023-37378(插件目录 DLL 劫持) |
| 3.10 | 2024 | Windows/ARM64 检测改进 |
| 3.11 | 2025-04 | 修 CVE-2025-43715(%WINDIR%\temp 插件目录竞争条件提权到 SYSTEM) |
| 3.12 | 2026 上半年 | 修 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 的最大下游使用者