NSIS制作安装包

这篇博客介绍了如何使用NSIS 3.0和ModernUI创建具备多语言支持的Windows安装包,包括设置语言选择、自定义数据存储路径、修改安装包信息以及动态读取项目版本作为安装包版本。同时,详细讲解了如何在安装和卸载过程中实现语言选择,并展示了如何在安装过程中让用户选择数据存储位置。

NSIS是一款免费的制作windows安装包的工具,功能灵活强大。

关于NSIS基础的安装,语法结构,请自行百度,本文仅针对于一些比较特别的功能做一些备忘记录。

1. 多语言的支持

此处仅介绍按照最新版的 NSIS 3.0 版本,使用 ModernUI 载入多语言

!include "MUI2.nsh"  ; 仅有2支持

; 语言选择窗口常量设置
; 在注册表中记录安装时选择的语言,卸载时就可以不再选择语言,直接显示对应语言的卸载程序
!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_ROOT_KEY}"
!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"

; 证书页,不同语言载入不同的 license 文件
LicenseLangString License 1033 "license-english.txt"
LicenseLangString License 2052 "license-chinese.txt"
!define MUI_LICENSEPAGE_CHECKBOX
!insertmacro MUI_PAGE_LICENSE $(License)

; 列出支持语言
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "SimpChinese"
; 无论如何,安装时都显示选择语言的选项
!insertmacro MUI_RESERVEFILE_LANGDLL

; 多语言文本定义
LangString ModuleMain ${LANG_SIMPCHINESE} "主程序"
LangString ModuleMain ${LANG_ENGLISH} "esreader main"
。
。
。

; .onInit 函数中引入显示语言选择框
Function .onInit
  ; 显示语言选项
  !insertmacro MUI_LANGDLL_DISPLAY
FunctionEnd

; 使用多语言文本定义的变量,注意是 $() 而不是 ${}
Section "$(ModuleMain)" SEC01
。
。
。
SectionEnd

; 卸载时,在 un.onInit 函数载入注册表中记录的语言
Function un.onInit
  !insertmacro MUI_UNGETLANGUAGE
FunctionEnd

其中需要特别注意的是,.onInit 以及 un.onInit 函数是在安装/卸载程序的UI出现之前就加载的,LangString 的定义是在UI出现之后,所以在 .onInit/un.onInit 中使用 LangString 不会生效

2. 自定义数据存储目录

。。。
; 选择安装目录页面
!insertmacro MUI_PAGE_DIRECTORY
; 自定义数据存储位置选择页面
Page custom chooseDataDirPage
。。。

; 选择文件存储位置页面
Function chooseDataDirPage
  ; 注册表中不存在安装位置,表示全新安装
  ; 如果是覆盖安装,则不需要选择数据存储目录,防止软件数据出问题
  ${If} $installPosition == ""
    ; 设置 dataDir 的默认值为 C:\akdata
    StrCpy $dataDir "C:\akdata"
    !insertmacro MUI_HEADER_TEXT "$(ChooseFileHeader1)" "$(ChooseFileHeader2)"
    nsDialogs::Create /NOUNLOAD 1018
    Pop $chooseDirDialog

    ${If} $chooseDirDialog == error
      Abort
    ${EndIf}

    ${NSD_CreateDirRequest} 0 23u 225u 12u "$dataDir"
    Pop $chooseDirDialog
    ${NSD_OnChange} $chooseDirDialog changeDir

    ${NSD_CreateBrowseButton} 235u 23u 45u 15u "$(ChooseFileBtn)"
    Pop $chooseDirBtn
    ${NSD_OnClick} $chooseDirBtn showDialog

    nsDialogs::Show
  ${EndIf}
FunctionEnd

; 目录改变时,将当前位置写入变量 dataDir
Function changeDir
  ${NSD_GetText} $chooseDirDialog $dataDir
FunctionEnd

; 显示文件选择对话框
Function showDialog
  nsDialogs::SelectFolderDialog /NOUNLOAD "$(ChooseFileHeader2)" ""
  Pop $dataDir
  ${If} $dataDir != error
    ${NSD_SetText} $chooseDirDialog $dataDir
  ${EndIf}
FunctionEnd

3. 安装包的一些基本信息

此处配置主要是为了修改生成的安装包的如下信息:

; 定义安装文件信息
VIProductVersion "${PRODUCT_VERSION}"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} FileDescription "${PRODUCT_NAME}"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} FileVersion "${PRODUCT_VERSION}"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} ProductName "${PRODUCT_NAME}"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} ProductVersion "${version}"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} LegalCopyright "Copyright(C) XXX. All rights reserved"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} CompanyName "${PRODUCT_PUBLISHER}"

 

4. 配合读取项目版本,作为安装包的版本

这里以读取比如 nodejs 项目中的 package.json 文件的版本号为例,需要先写一个 bat 或者 sh 脚本,从 package.json 文件中读取 version 字段,并且写入到 version.txt 文件中

@echo off
REM 获取版本号

for /f "tokens=1,2* delims=," %%a in (package.json) do (
    echo %%a | findstr "version" >nul && set VERSION=%%a
)
echo !define version "%VERSION:~-6,5%" > version.txt

version.txt 文件中写入的内容是:

!define version "0.0.7" 

然后,在 NSIS 脚本中,调用脚本,并且载入 version.txt 文件并使用 version 变量

!system "get-version.bat"
!include "version.txt"


; 使用 version 字段,就如同变量一样,用 ${version} 即可

NSIS安装包制作教程 分为三个目录:基础,插件,脚本 NSIS System 插件 NSIS VPatch 3.1插件 NSIS InstallOptions 2 插件 NSIS Modern UI(新式用户界面)插件 NSIS的Modern UI插件 NSIS里特殊符号的表达方法 两组件互斥 NSIS 常用小问题合集 资源替换式的美化包制作方式代码 安装完毕后如何刷新文件关联 教你如何编程调用 NSIS 的插件 NSIS安装程序概要 实现 NSIS 自定义页面中的控件操作代码 如何使用NSIS实现多目录安装设置 如何用NSIS在加入注册表 用NSIS 制作自己的安装程序 bluewind 的 wmp9 nsis安装脚本 NSIS安装脚本简明教程 取得winamp的NSIS脚本的教程 迅雷5.7.3.389 AYU增强版的安装脚本 NSIS制作迅雷安装的脚本 迅雷5.7.2.371 DDR1.5版去广告版源代码说明 NSIS删除安装程序自身 帮助文件中关于静默安装的说明 NSIS实现静默安装的两种方法 nsis的附加任务代码 关于 NSIS 写入注册表的问题 少轻狂制作的Windows优化大师的安装脚本 aipc编写的nsis极点安装脚本 官方 NSIS 插件全集 全方位掌握NSIS的使用 NSIS语言里怎样安装一个.inf文件? 如果要关联某个文件给程序应该怎么做? 如何避免显示解压缩进度框? 关于检测操作系统的问题 在结束页面添加运行程序选项 NSIS的botton二选一如何实现? NSIS灵活应用用逻辑库 NSIS调用inf安装驱动后的卸载问题 NSIS的组件互斥代码 在NSIS中如何禁止一个组件组的父项的点击事件 关于打破 NSIS 的 8192 字节限制的更简单方法 NSIS 自定义页面结合组件选择安装 一个关于组件跟自定义页面的控制问题 如何把安装的卸载程序放到其他目录
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值