研究electron,发现electron-build最终使用的是nsis,所以顺便学了下nsis,同时发现了一片大佬的文档,并在此大佬的基础上做了总结,只对基础知识做了总结,大佬还提供了一个例子,非常优秀。
原文链接:https://juejin.cn/post/7004398823082557476
中文文档:https
文章目录
1.概述
NSIS 是开发者用来创建安装程序的工具 ,它允许程序员控制安装、卸载、设置系统设置、解压文件等,且是最小的安装程序系统,在默认情况下仅为34KB。
需要注意的是:在 NSIS 脚本里每一行都作为一个命令处理, 如果这一行太长的话你可以使用 “\” 来分隔,编译器会自动地把下一行接到上一行来作为完整的一行,而不是看作新的行,如果在字符串里需要使用双引号,你应该使用 $" 来避免误解
2.特性
- 脚本化,支持多文件的代码组织
- 注册表编辑、执行脚本、修改环境变量
- 较小的安装压缩大小
- 较为美观的界面,还支持自定义界面
- 插件系统
- 支持网络安装
- 支持做补丁安装
3.安装
- 官网下载:https://nsis.sourceforge.io/Download
- 安装:一直next就行
- 环境变量配置:在系统变量Path中,配置你本地nsis的安装路径
- 测试:重启后,输入
nsis
跳出nsis的页面,安装成功
4.脚本格式
脚本文件的默认扩展名是 .nsi ,头文件为 .nsh 。头文件可以通过把它划分为一个或多个代码块来帮助你编排脚本,你也可以在头文件里加入功能函数或宏,并且在多个安装程序里包含头文件,这样可以更容易的升级你的程序,并且使你的脚本很容易的让人看懂。要把一个头文件包含在你的脚本里你可以使用 !include 。这样就可以仅使用名字包含位于NSIS目录下的 Include文件夹 下的头文件。例如:!include Sections.nsh
5.脚本结构
一个 NSIS 脚本应该包括安装程序属性和区段、函数,但是必须包含OutFile属性。
5.1安装程序属性
安装程序属性确定你的安装程序的性能、外观和习惯,由这些属性你可以更改安装的时候显示的文本、安装类型,这些属性大多数在运行时被设定并且不能更改。
5.2页面
一个非静默安装程序(也就是需要安装的软件,非绿色版)需要向导来指导用户运行安装程序,可以通过Page或者PageEx来设置页面
5.3区段
在一个普通的安装包里用户需要安装许多东西。例如在 NSIS 发行安装程序里你可以选择安装源码、附加插件、脚本样例或其他。以上每个组件都有自己的一段代码。 当用户选择了安装该组件,那么安装程序就会执行对应的代码。在脚本里,这些代码称为区段。在组件页面里每个区段对应一个组件。区段名就是显示的组件名,如果组件被选中则区段代码将会被执行.你可以只使用一个区段来构建安装程序,但是如果你想要使用组件页来让用户选择可选的安装组件,你必须使用一个以上的区段。
卸载程序也可以有多个区段。卸载程序区段名前要加上前缀 ‘un.’ 。
例如:
Section "Installer Section"
SectionEnd
Section "un.Uninstaller Section"
SectionEnd
5.4函数
函数和区段类似,也包含了代码。区段和函数所不同的是他们被调用的形式。一共有两种函数类型:用户函数和回调函数。用户函数可以从一个区段里或另一个函数使用 Call 指令。用户函数不能直接执行而只能调用它。回调函数可以nsis在检测到某些时间发生后调用这些函数,就像vue的钩子函数。
例如:
Function .onInit
MessageBox MB_YESNO "即将安装我的程序,要继续吗?" IDYES gogogo
Abort
gogogo:
FunctionEnd
5.4.1调用自定义函数
Call 函数名
6变量和常量
6.1转义符号
$
,例如在字符串中使用变量,就要用$$
符号,用来表示 $
6.2常量
6.2.1自定义常量
- 语法:
!define 常量名 常量值
- 例如:
!define NAME "名字"
6.2.2获取常量
- 语法:
$变量名或者${变量名}
,字符串中要使用$
要使用$$
6.2.3系统常量
- 已注册常量:
$0-$9
和$R0-&R9
- 其余常量
6.3变量
在nsis中,变量都是全局的,在区段和函数定义的变量必须使用/GLOBAL,例如
Var /GLOBAL example2
6.3.1变量定义
Var 变量名
6.3.2变量赋值
nsis不能使用
=
来赋值,需要借助来实现,例如StrCpy $i "hello"
6.3.3变量获取
与常量的方式相同
6.逻辑语法
6.1StrCmp(字符串判断)
语法:字符串1 字符串2 相同时跳转的标记 [不相同时跳转的标记]
6.2StrCmpS(字符串忽略大小写判断)
语法:字符串1 字符串2 相同时跳转的标记 [不相同时跳转的标记]
6.3Goto(逻辑跳转)
语法:要跳转的标记 | +偏移| -偏移| 用户变量(目标地址)
Goto +1 跳转到下一条指令,Goto -1 跳转到上一条指令,等等。
常见问题*******************
中文乱码
额,nsis对中文支持的不是太好,所以需要使用一下命令来指定字符集合
makensis /INPUTCHARSET UTF8 nsi文件路径
,例如:makensis /INPUTCHARSET UTF8 .\installer1.nsi