NSIS打包(二)第一个安装包
基本介绍完之后,我们大概了解了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打包(二)第一个安装包的更多相关文章
- NSIS:制作软件升级安装包
原文 NSIS:制作软件升级安装包 相信不是每个人写的软件都只发布一次就可以了,肯定要有修改和维护的情况发生.在这种情况下,您可能就需要一个软件的升级安装包了. 现在,我们就来一步步把这个安装包做 ...
- 打包文件到APK安装包中
打包文件到APK安装包中 目的:将配置文件或SQLITE打包进APK中 1.首先,打开菜单 Project - Deployment 2.点击添加按钮,选择要添加的文件(文件最好放在工程目录中,这样, ...
- 使用node-webkit(v0.35.5)和innosetup(3.6.1)打包将web程序打包为桌面客户端(安装包)
这边主要是有一个客户,需要在电视机上安装一个客户端,含有视频直播功能:刚开始我们采用的webapp打包成apk安装在电视机上,发现摄像头监控画面根本无法播放(apk在手机上可以正常播放视频):排除一些 ...
- C#进阶系列——使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)
前言:上篇C#进阶系列——使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)介绍了下使用Advanced Installer配置IIS和Web.confi ...
- 使用Advanced Installer制作IIS安装包(二:配置安装包依赖项和自定义dll)
前言:上篇使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)介绍了下使用Advanced Installer配置IIS和Web.config的过程,操作起 ...
- Qt之程序发布以及打包成exe安装包
一.简述 Qt项目开发完成之后,需要打包发布程序,而因为用户电脑上没有Qt配置环境,所以需要将release生成的exe文件和所依赖的dll文件复制到一个文件夹中,然后再用 Inno Setup打包工 ...
- Qt 程序发布以及打包成exe安装包
一.简述 Qt 项目开发完成之后,需要打包发布程序,而因为用户电脑上没有 Qt 配置环境,所以需要将 release 生成的 exe 文件和所依赖的 dll 文件复制到一个文件夹中,然后再用 Inno ...
- .NetCore(Avalonia) 项目dll混淆,Ubuntu 或者deepin操作系统 deb安装包解压,重新打包
.NetCore(Avalonia) 项目dll混淆,deb安装包解压,重新打包 本文分为两部分,一部分是介绍使用 DotNetReactor6.0 及以上版本混淆.netcore项目的dll. 另一 ...
- c# 编写windows 服务,并制作安装包
对服务的认识有很多个阶段. 第一阶段:当时还在用c++,知道在一个进程里while(True){},然后里面做很多很多事情,这就叫做服务了,界面可能当时还用Console控制台程序. 第二阶段:知道了 ...
随机推荐
- cocos2d-x 系列文章介绍
学习 cocos2d-x 一年多,从3.0bata 到 现在的 3.6 ,从最早没什么教程到现在官网繁多的资料教程, cocos2d-x 的变化实在是大.刚开始学习 cocos2d-x 是到处找资 ...
- git 创建版本库
服务器安装后git后 1.在repositories仓库文件夹中执行git init aa.git --bare 创建aa的中心库(注意建立aa版本库时当前登录用户必须为git的相关用户,并保证/d ...
- Android图片加载与缓存开源框架:Android Glide
<Android图片加载与缓存开源框架:Android Glide> Android Glide是一个开源的图片加载和缓存处理的第三方框架.和Android的Picasso库类似,个人感觉 ...
- JDBC中的ResultSet
ResultSet:结果集.存放数据库中的数据,可以将它想象成一张数据表,通过Statement对象中的executeQuery()方法获得 import com.mysql.jdbc.Stateme ...
- iOS学习之GCD
多线程编程 线程定义:一个CPU执行的CPU命令 列一条无分叉的路径就叫线程. 多线程:执行多个不同的CPU命令 有多条路径. 线程的使用:主线程(又叫作UI线程)主要任务是处理UI事件,显示和刷新U ...
- RabbitMQ/JAVA (路由选择)
上篇博文中,我们建立了一个简单的日志系统.可以广播消息给多个消费者.本篇博文,我们将添加新的特性--我们可以只订阅部分消息.比如:我们可以接收Error级别的消息写入文件.同时仍然可以在控制台打印所有 ...
- 遇到tomcat端口被占用问题解决方案
1) 启动Eclipse的Tomcat5.0时,报以下错误: 2)根据以上提示显示:Tomcat Server 的8080端口已经被占用.查看它被哪个占用,方法如下: 3)可以看到占用此端口的PID为 ...
- USB协议-USB设备的枚举过程
USB主机在检测到USB设备插入后,就要对设备进行枚举了.为什么要枚举?枚举就是从设备读取各种描述符信息,这样主机就可以根据这些信息来加载合适的驱动程序,从而知道设备是什么样的设备,如何进行通信等. ...
- (实用篇)php数组查找函数in_array()、array_search()、array_key_exists()使用
php在数组中查找指定值是否存在的方法有很多,记得很久以前我一直都是傻傻的用foreach循环来查找的,下面我主要分享一下用php内置的三个数组函数来查找指定值是否存在于数组中,这三个数组分别是 in ...
- 对于unallocated space的翻译 我想说几句话
在sqlserver中,当我们使用sp_spaceused查看数据库空间使用情况的时候 会看到属性unallocated space.所有的中文翻译都是“未保留供数据库对象使用的数据库空间”, 作为中 ...