基本介绍完之后,我们大概了解了NSIS中有哪些组件,现在我们通过一个简单的demo来学习如何使用这些组件。

1、环境配置

NSIS的环境非常简单,只有一个安装包,安装后即可使用。

官网:http://nsis.sourceforge.net/Main_Page,可以到这里下载最新的安装包,也有一些demo可以学习。

安装完之后,将安装目录添加到系统环境变量就可以正常使用了。(也可以将安装目录拷贝到要使用的地方)

这里我们使用的版本是v3.0b1

2、开始

以下是一个最简单的安装包代码:

 ; 输出文件的名字,必须写.exe后缀,不然无法打开
OutFile "Demo01.exe" ; 必须至少有一个Section,可以没有名字
; 这里我们的Section名字为"StartSec",内容只有一行,弹出一个对话框
Section StartSec
MessageBox MB_OK "My First NSIS Demo!"
SectionEnd

将以上内容保持至demo01.nsi文件中,打开cmd,执行命令makensis.exe demo01.nsi,即可生成Demo01.exe文件。

可以看出,除了一个Section,其他任何组件都没有,就可以是一个简单安装包了。

接下来我们来完善内容:

1)首先添加安装包详细信息

我们可以先来看一下生成的安装包。右键—>属性—>详细信息,如下图:

可以看到,只有时间和大小信息,我们来将内容填写完整。

 ; 安装包详细信息,更多信息可以查看帮助文档,安装目录下的NSIS.chm文件
; VIProductVersion是必须的,其他则可以根据需要来选择
VIProductVersion "1.0.0.0"
VIAddVersionKey /LANG= "ProductName" "Demo01"
VIAddVersionKey /LANG= "CompanyName" "MyCompany"
VIAddVersionKey /LANG= "ProductVersion" "1.0.0.0"
VIAddVersionKey /LANG= "LegalCopyright" "2014 China"
VIAddVersionKey /LANG= "FileDescription" "Demo01 安装程序"
VIAddVersionKey /LANG= "FileVersion" "1.0.0.0"

然后我们再次查看生成的安装包属性:

2)添加安装路径

通过设置InstallDir的值来设置默认安装路径:

 /*
* 对于32位安装包,$PROGRAMFILES在32位系统下为Program Files,64位系统为Program Files (x86)
* 对于64位安装包,$PROGRAMFILES位Program Files,只能在64位系统下安装
* 我们这里制作的是32位安装包,如果要做64位的,加上这句"!define LIBRARY_X64"
*/
InstallDir "$PROGRAMFILES\Demo01"

在Section中使用SetOutPath就可以在安装的时候创建目录了:

 /*
* 设置安装包安装时的文件输出路径,$INSTDIR获取到的就是
* 我们上面设置的InstallDir路径,若目录不存在,则创建
*/
SetOutPath "$INSTDIR"

完整代码如下:

 ; 安装包详细信息,更多信息可以查看帮助文档,安装目录下的NSIS.chm文件
; VIProductVersion是必须的,其他则可以根据需要来选择
VIProductVersion "1.0.0.0"
VIAddVersionKey /LANG= "ProductName" "Demo01"
VIAddVersionKey /LANG= "CompanyName" "MyCompany"
VIAddVersionKey /LANG= "ProductVersion" "1.0.0.0"
VIAddVersionKey /LANG= "LegalCopyright" "2014 China"
VIAddVersionKey /LANG= "FileDescription" "Demo01 安装程序"
VIAddVersionKey /LANG= "FileVersion" "1.0.0.0" ; 输出文件的名字,必须写.exe后缀,不然无法打开
OutFile "Demo01.exe" /*
* 对于32位安装包,$PROGRAMFILES在32位系统下为Program Files,64位系统为Program Files (x86)
* 对于64位安装包,$PROGRAMFILES位Program Files,只能在64位系统下安装
* 我们这里制作的是32位安装包,如果要做64位的,加上这句"!define LIBRARY_X64"
*/
InstallDir "$PROGRAMFILES\Demo01" ; 必须至少有一个Section,可以没有名字
; 这里我们的Section名字为"StartSec",内容只有一行,弹出一个对话框
Section StartSec
MessageBox MB_OK "My First NSIS Demo!" /*
* 设置安装包安装时的文件输出路径,$INSTDIR获取到的就是
* 我们上面设置的InstallDir路径,若目录不存在,则创建
*/
SetOutPath "$INSTDIR"
SectionEnd

3)添加卸载信息

一般的安装包是在安装的时候自动生成卸载程序(之后会介绍如何将安装包和卸载程序分成两个包来做)。

要生成卸载程序需要两步:

首先,要在StartSec(最初的Section)中使用WriteUninstaller来设置卸载程序的生产路径和名字,WriteUninstaller "$INSTDIR\uninst.exe"

然后,需要在程序中添加一个名字为Uninstall的Section作为卸载程序的入口。

完整代码如下:

 ; 安装包详细信息,更多信息可以查看帮助文档,安装目录下的NSIS.chm文件
; VIProductVersion是必须的,其他则可以根据需要来选择
VIProductVersion "1.0.0.0"
VIAddVersionKey /LANG= "ProductName" "Demo01"
VIAddVersionKey /LANG= "CompanyName" "MyCompany"
VIAddVersionKey /LANG= "ProductVersion" "1.0.0.0"
VIAddVersionKey /LANG= "LegalCopyright" "2014 China"
VIAddVersionKey /LANG= "FileDescription" "Demo01 安装程序"
VIAddVersionKey /LANG= "FileVersion" "1.0.0.0" ; 输出文件的名字,必须写.exe后缀,不然无法打开
OutFile "Demo01.exe" /*
* 对于32位安装包,$PROGRAMFILES在32位系统下为Program Files,64位系统为Program Files (x86)
* 对于64位安装包,$PROGRAMFILES位Program Files,只能在64位系统下安装
* 我们这里制作的是32位安装包,如果要做64位的,加上这句"!define LIBRARY_X64"
*/
InstallDir "$PROGRAMFILES\Demo01" ; 必须至少有一个Section,可以没有名字
; 这里我们的Section名字为"StartSec",内容只有一行,弹出一个对话框
Section StartSec
MessageBox MB_OK "My First NSIS Demo!" /*
* 设置安装包安装时的文件输出路径,$INSTDIR获取到的就是
* 我们上面设置的InstallDir路径,若目录不存在,则创建
*/
SetOutPath "$INSTDIR" ; 这是卸载程序的生成路径
WriteUninstaller "$INSTDIR\uninst.exe"
SectionEnd ; 若要生成卸载程序,必须要有一个名字为Uninstall的Section作为卸载程序的入口
Section Uninstall SectionEnd

4)添加应用程序文件

这一步非常简单,只需要将要安装的文件安装路径添加到安装包里就可以了,我们以宏的形式来做(后面讲为什么不用函数),代码如下:

 !macro CpFiles
SetOutPath "$INSTDIR"
File "Files\test.txt"
!macroend

调用的时候使用:!insertmacro CpFiles

5)添加桌面和开始菜单快捷方式

现在来添加快捷方式,用函数来实现,如下:

 Function CreateShoutCut
; 写为all表示将快捷方式写入所有用户的共享目录,这样每个用户都可以看见快捷方式
; 写为current表示将快捷方式写入当前用户目录,只有当前用户可以看到
; 通过打印$SMPROGRAMS的值就可以看到路径,这里就不列出了
SetShellVarContext all ; 为快捷方式创建目录,必须写绝对路径
CreateDirectory "$SMPROGRAMS\Demo01" /*
* 以下是开始菜单和桌面快捷方式的设置
* 名字为"启动Demo01",关联文件为test.txt,生成后就可以通过快捷方式打开test.txt了。
* 同理,卸载快捷方式名字为"卸载Demo01",关联文件为uninst.exe,卸载的内容已经都写
* 到Uninstall的Section中了,在生成uninst.exe时将内容写入其中。
* CreateShortCut更详细的使用请查看帮助文档。
*/
; 开始菜单快捷方式
CreateShortCut "$SMPROGRAMS\Demo01\启动Demo01.lnk" "$INSTDIR\test.txt" "" ""
CreateShortCut "$SMPROGRAMS\Demo01\卸载Demo01.lnk" "$INSTDIR\uninst.exe" "" "" ; 桌面快捷方式
CreateShortCut "$DESKTOP\启动Demo01.lnk" "$INSTDIR\test.txt" "" ""
FunctionEnd

调用时用Call命令:Call CreateShoutCut

6)完整的demo01代码附件

这样我们的第一个NSIS安装包Demo就完成了,下面给出完整demo代码:

(由于程序中多次用到”Demo01”,因此我们可以用一个宏定义来替代,这里为了明确每个地方的字符串具体内容,所以没有使用宏)

运行该代码时需要在代码文件的当前目录创建Files文件夹,文件夹里创建test.txt文件,然后用makensis.exe就可以生成Demo01.exe安装包了。

; ------------------------------------------------------------ ;
; File: demo01.nsi
; Author: laoma
; Date: --
; ------------------------------------------------------------ ; ; 安装包详细信息,更多信息可以查看帮助文档,安装目录下的NSIS.chm文件
; VIProductVersion是必须的,其他则可以根据需要来选择
VIProductVersion "1.0.0.0"
VIAddVersionKey /LANG= "ProductName" "Demo01"
VIAddVersionKey /LANG= "CompanyName" "MyCompany"
VIAddVersionKey /LANG= "ProductVersion" "1.0.0.0"
VIAddVersionKey /LANG= "LegalCopyright" "2014 China"
VIAddVersionKey /LANG= "FileDescription" "Demo01 安装程序"
VIAddVersionKey /LANG= "FileVersion" "1.0.0.0" ; 输出文件的名字,必须写.exe后缀,不然无法打开
OutFile "Demo01.exe" /*
* 对于32位安装包,$PROGRAMFILES在32位系统下为Program Files,64位系统为Program Files (x86)
* 对于64位安装包,$PROGRAMFILES位Program Files,只能在64位系统下安装
* 我们这里制作的是32位安装包,如果要做64位的,加上这句"!define LIBRARY_X64"
*/
InstallDir "$PROGRAMFILES\Demo01" !macro CpFiles
SetOutPath "$INSTDIR"
File /r "Files\test.txt"
!macroend ; 必须至少有一个Section,可以没有名字
; 这里我们的Section名字为"StartSec",内容只有一行,弹出一个对话框
Section StartSec
/*
* 设置安装包安装时的文件输出路径,$INSTDIR获取到的就是
* 我们上面设置的InstallDir路径,若目录不存在,则创建
*/
SetOutPath "$INSTDIR" ; 调用宏来拷贝文件,安装的时候会将拷贝的文件写到安装路径下
!insertmacro CpFiles ; 这是卸载程序的生成路径
WriteUninstaller "$INSTDIR\uninst.exe" ; 创建快捷方式
Call CreateShoutCut
SectionEnd ; 若要生成卸载程序,必须要有一个名字为Uninstall的Section作为卸载程序的入口
Section Uninstall
; 删除快捷方式
SetShellVarContext all
Delete "$DESKTOP\启动Demo01.lnk"
Delete "$SMPROGRAMS\Demo01\卸载Demo01.lnk"
Delete "$SMPROGRAMS\Demo01\启动Demo01.lnk"
RMDir "$SMPROGRAMS\Demo01" ; 删除文件
Delete /REBOOTOK "$INSTDIR\test.txt"
Delete /REBOOTOK "$INSTDIR\uninst.exe" ; 删除安装目录
RMDir "$INSTDIR\Demo01"
SectionEnd Function CreateShoutCut
; 写为all表示将快捷方式写入所有用户的共享目录,这样每个用户都可以看见快捷方式
; 写为current表示将快捷方式写入当前用户目录,只有当前用户可以看到
; 通过打印$SMPROGRAMS的值就可以看到路径,这里就不列出了
SetShellVarContext all ; 为快捷方式创建目录,必须写绝对路径
CreateDirectory "$SMPROGRAMS\Demo01" /*
* 以下是开始菜单和桌面快捷方式的设置
* 名字为"启动Demo01",关联文件为test.txt,生成后就可以通过快捷方式打开test.txt了。
* 同理,卸载快捷方式名字为"卸载Demo01",关联文件为uninst.exe,卸载的内容已经都写
* 到Uninstall的Section中了,在生成uninst.exe时将内容写入其中。
* CreateShortCut更详细的使用请查看帮助文档。
*/
; 开始菜单快捷方式
CreateShortCut "$SMPROGRAMS\Demo01\启动Demo01.lnk" "$INSTDIR\test.txt" "" ""
CreateShortCut "$SMPROGRAMS\Demo01\卸载Demo01.lnk" "$INSTDIR\uninst.exe" "" "" ; 桌面快捷方式
CreateShortCut "$DESKTOP\启动Demo01.lnk" "$INSTDIR\test.txt" "" ""
FunctionEnd

NSIS打包(二)第一个安装包的更多相关文章

  1. NSIS:制作软件升级安装包

    原文 NSIS:制作软件升级安装包 相信不是每个人写的软件都只发布一次就可以了,肯定要有修改和维护的情况发生.在这种情况下,您可能就需要一个软件的升级安装包了.   现在,我们就来一步步把这个安装包做 ...

  2. 打包文件到APK安装包中

    打包文件到APK安装包中 目的:将配置文件或SQLITE打包进APK中 1.首先,打开菜单 Project - Deployment 2.点击添加按钮,选择要添加的文件(文件最好放在工程目录中,这样, ...

  3. 使用node-webkit(v0.35.5)和innosetup(3.6.1)打包将web程序打包为桌面客户端(安装包)

    这边主要是有一个客户,需要在电视机上安装一个客户端,含有视频直播功能:刚开始我们采用的webapp打包成apk安装在电视机上,发现摄像头监控画面根本无法播放(apk在手机上可以正常播放视频):排除一些 ...

  4. C#进阶系列——使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)

    前言:上篇C#进阶系列——使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)介绍了下使用Advanced Installer配置IIS和Web.confi ...

  5. 使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)

    前言:上篇使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)介绍了下使用Advanced Installer配置IIS和Web.config的过程,操作起 ...

  6. Qt之程序发布以及打包成exe安装包

    一.简述 Qt项目开发完成之后,需要打包发布程序,而因为用户电脑上没有Qt配置环境,所以需要将release生成的exe文件和所依赖的dll文件复制到一个文件夹中,然后再用 Inno Setup打包工 ...

  7. Qt 程序发布以及打包成exe安装包

    一.简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno ...

  8. .NetCore(Avalonia) 项目dll混淆,Ubuntu 或者deepin操作系统 deb安装包解压,重新打包

    .NetCore(Avalonia) 项目dll混淆,deb安装包解压,重新打包 本文分为两部分,一部分是介绍使用 DotNetReactor6.0 及以上版本混淆.netcore项目的dll. 另一 ...

  9. c# 编写windows 服务,并制作安装包

    对服务的认识有很多个阶段. 第一阶段:当时还在用c++,知道在一个进程里while(True){},然后里面做很多很多事情,这就叫做服务了,界面可能当时还用Console控制台程序. 第二阶段:知道了 ...

随机推荐

  1. 常用的获取时间差的sql语句

    "select count(*) from [注册] where datediff(day,time,getdate())<1";//获取当天注册人员数 sql=" ...

  2. HDU 3397 Sequence operation

    题目:下列操作 Change operations:0 a b change all characters into '0's in [a , b]1 a b change all character ...

  3. CSU 1325 莫比乌斯反演

    题目大意: 一.有多少个有序数对(x,y)满足1<=x<=A,1<=y<=B,并且gcd(x,y)为p的一个约数: 二.有多少个有序数对(x,y)满足1<=x<=A ...

  4. Rhel6-mysql_cluster配置文档

    MySQL Cluster 是一种技术,其主要功能是在无共享的相关系统中部署内存中数据库 的 Cluster .在通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求. 此外,由于每个组 ...

  5. [vijos P1083] 小白逛公园

    不知怎地竟有种错觉此题最近做过= =目测是类似的?那道题貌似是纯动归? 本来今晚想做两道题的,一道是本题,一道是P1653疯狂的方格取数或NOI08 Employee,看看现在的时间目测这个目标又达不 ...

  6. Linux I2C总线设备驱动模型分析(ov7740)

    1. 框架1.1 硬件协议简介1.2 驱动框架1.3 bus-drv-dev模型及写程序a. 设备的4种构建方法a.1 定义一个i2c_board_info, 里面有:名字, 设备地址 然后i2c_r ...

  7. 关于MVC

    MVC,或多或少都有听说过.这个模式在客户端程序里面比较常见.以前有人老说mvc是什么设计模式之类.至少我理解的不是.我觉得 MVC是一种模块划分方法.根据它,我们可以快速地划分单独某个模块.比如排行 ...

  8. myeclipse中文乱码,JSP页面乱码

    一.设置新建常见文件的默认编码格式,也就是文件保存的格式.在不对MyEclipse进行设置的时候,默认保存文件的编码,一般跟简体中文操作系统(如windows2000,windowsXP)的编码一致, ...

  9. 百度之星热身赛-1001(dfs拓扑排序)

    题意:作为年度优秀魔法学员的奖赏,哈利得到了一台具有魔力的计算机.这台计算机一旦开始处理某个任务,就会一直处理到这个任务结束为止(所以你可以认为它是单线程的).有一天,这台计算机得到了n个任务要处理, ...

  10. 简单的JS多物体的运动---运动和透明度的变化

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...