码迷,mamicode.com
首页 > 其他好文 > 详细

用 NSIS 制作安装程序

时间:2015-09-18 13:55:26      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

用 NSIS 制作安装程序

最近要给自己写的一个小程序做个安装程序。我的程序是用Qt开发的,所以本来想研究一下 Qt Installer Framework。 但是用 Qt Installer Framework 做安装程序好像还挺麻烦,研究了一会儿没有什么头绪,所以就暂时放弃了。然后就在网上随便搜了搜,发现有个 NSIS,看介绍还比较简单,就试着用了用,感觉还可以。这篇其实就是我学习 NSIS 时的一个学习笔记。

NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序。它提供了安装、卸载、系统设置、文件解压缩等功能。NSIS 通过它的脚本语言来描述安装程序的行为和逻辑的。

NSIS 的主页在:http://nsis.sourceforge.net

在这里可以找到最近版本的 NSIS。 我使用的版本是 3.0b2。

Hello world!

前面已经说过 NSIS 通过它的脚本语言来描述安装程序的行为和逻辑的。下面就先来看一个最简单的脚本文件: 1.nsi

    # name the installer
    OutFile "Installer.exe"

    # default section start; every NSIS script has at least one section.
    Section

    # default section end
    SectionEnd

文件中,所有 # 开始的行都是注释。除了这些注释外,这个脚本其实什么也没做。但是却给出了 NSI 脚本的框架。

利用 NSIS 提供的工具 MakeNSISW 可以编译这个脚本。编译成功后会有类似这样的输出:

技术分享

点击 Test Installer 可以直接运行刚才生成的安装文件。运行后的结果如下:
技术分享
这个安装程序现在还什么都做不了。下面将这个安装脚本扩充一点。

    # set the name of the installer
    Outfile "helloworld.exe"

    # create a default section.
    Section

    # create a popup box, with an OK button and the text "Hello world!"
    MessageBox MB_OK "Hello world!"

    SectionEnd

生成的安装文件改名为 helloworld.exe。运行这个安装文件后会弹出一个对话框:
技术分享

到这里,我们的安装程序至少有点功能了。

文本文件读写

下面的例子要让我们的 NSIS 脚本做些文件读写的工作。这种类型的操作在安装程序中还是经常要用到的。比如生成个配置文件一类的工作都是要文件读写的。

    # declare name of installer file
    Outfile "hello world.exe"

    # open section
    Section

    # create a popup box, with an OK button and some text
    MessageBox MB_OK "Now We are Creating Hello_world.txt at Desktop!"

    # open an output file called "Hello_world.txt", 
    # on the desktop in write mode. This file does not need to exist 
    # before script is compiled and run

    FileOpen $0 "$DESKTOP\Hello_world.txt" w

    # write the string "hello world!" to the output file
    FileWrite $0 "hello world!"

    # close the file
    FileClose $0
    # Show Success message.
    MessageBox MB_OK "Hello_world.txt has been created successfully at Desktop!"

    # end the section
    SectionEnd

上面的脚本很简单,其中 FileOpen、FileWrite、FileClose 是三个文件操作函数。
$0 是文件句柄。

文件拷贝

安装程序最重要的功能是将我们的文件拷贝到安装路径下。所以这一部分内容要仔细讲讲。
还是先从一个最简单的例子程序开始,将一个文本文件安装到指定的安装路径下。在这里,安装路径设为桌面。后面的例子还会交给大家如何让安装程序可以自定义安装路径。
我们的文本文件名为 test.txt。这个文件需要和我们的脚本放在一个目录中,这样 NSIS 才能找到。通常我们会为每一个安装程序项目建立一个文件夹,文件夹中放置 NSIS 脚本和我们的程序的相关文件。

    # define the name of the installer
    Outfile "simple installer.exe"

    # define the directory to install to, the desktop in this case as specified  
    # by the predefined $DESKTOP variable
    InstallDir $DESKTOP

    # default section
    Section

    # define the output path for this file
    SetOutPath $INSTDIR

    # define what to install and place it in the output path
    File test.txt

    SectionEnd

安装完程序之后还应该提供卸载功能。下面就把这部分功能添加上。

    # define installer name
    OutFile "installer.exe"

    # set desktop as install directory
    InstallDir $DESKTOP

    # default section start
    Section

    # define output path
    SetOutPath $INSTDIR

    # specify file to go in output path
    File test.txt

    # define uninstaller name
    WriteUninstaller $INSTDIR\uninstaller.exe


    #-------
    # default section end
    SectionEnd

    # create a section to define what the uninstaller does.
    # the section will always be named "Uninstall"
    Section "Uninstall"

    # Always delete uninstaller first
    Delete $INSTDIR\uninstaller.exe

    # now delete installed file
    Delete $INSTDIR\test.txt

    SectionEnd

这部分代码也很简单,但是我没有搞明白为啥要先删除自己,再删除其他文件。把这两个删除语句调换一下位置,运行的也挺正常。这里的原理还请高手们指导。

开始菜单增加条目

下面的代码会在开始菜单的应用程序条目中增加一个快捷方式,指向我们的 uninstall.exe。 为了简单,我们的安装路径还是在桌面。

    # define name of installer
    OutFile "installer.exe"

    # define installation directory
    InstallDir $DESKTOP

    # For removing Start Menu shortcut in Windows 7
    RequestExecutionLevel user

    # start default section
    Section

        # set the installation directory as the destination for the following actions
        SetOutPath $INSTDIR

        # create the uninstaller
        WriteUninstaller "$INSTDIR\uninstall.exe"

        # create a shortcut named "new shortcut" in the start menu programs directory
        # point the new shortcut at the program uninstaller
        CreateShortCut "$SMPROGRAMS\new shortcut.lnk" "$INSTDIR\uninstall.exe"
    SectionEnd

    # uninstaller section start
    Section "uninstall"

        # first, delete the uninstaller
        Delete "$INSTDIR\uninstall.exe"

        # second, remove the link from the start menu
        Delete "$SMPROGRAMS\new shortcut.lnk"

    # uninstaller section end
    SectionEnd

这段脚本编译之后生成的安装文件的作用是在桌面放一个 uninstall.exe,然后再开始菜单的应用程序中增加一个 new shortcut.lnk。这个 new shortcut.lnk 指向 uninstall.exe。

需要多说一句

    # For removing Start Menu shortcut in Windows 7
    RequestExecutionLevel user

如果忘了写,则每次卸载时都需要用户做权限确认。 其实这样也挺好,多些提醒也没什么坏处。

读取注册表

注册表操作也是安装程序经常要做的工作。
下面这段脚本通过读取注册表中相关的字段来判断系统中是否安装了 JRE 环境。

    # name the installer
    OutFile "installer.exe"

    #default section start
    Section

        # read the value from the registry into the $0 register
        ReadRegStr $0 HKLM "SOFTWARE\JavaSoft\Java Runtime Environment" CurrentVersion

        # print the results in a popup message box
        MessageBox MB_OK "version: $0"

    # default section end
    SectionEnd

有了上面这些知识,就可以写个简单的安装程序。实际上 NSIS 的功能远不止这些。等以后用到那些功能时我再写博客来记录。

另外,准备一台“干净”的电脑也非常重要。所以干净,指的是这台电脑最好只安装了操作系统。这样才比较容易确定安装程序是否落下一些文件。当然,干这事情虚拟机是最适合的了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

用 NSIS 制作安装程序

标签:

原文地址:http://blog.csdn.net/liyuanbhu/article/details/48542739

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!