安装包制作工具(一)

当写完代码后除了一系列exe、dll等执行文件还包括一些附加脚本文件以及配置数据文件,为了将这些文件打包给其他人使用通常需要制作一个安装包,试用了包括NSIS、InnoSetup等工具。也不是不能用,就是感觉不是很称手。程序员嘛好学会自己造轮子。

其实这个轮子早就造好了,一直没有时间记录一下。现在是慢慢回忆、慢慢写文章。之前使用WPF写的现在回忆起来有点痛苦,好久没用过这个玩意儿了。

效果图

界面就非常简单了,还需要配置一个pack.json才能把一系列文件打包成安装文件

image-20230725204324774.png

之前不能打开打包完成的安装包经过调试发现是替换图标的流程出现问题,导致打包后的文件实际上没有包含MakeInstaller的本地也就不能执行安装流程了。补上安装过程的截图

打包配置

为了减少开发量,各种配置通过json文件完成,这样也方便快捷。需要制作安装包的大概也能接受用配置文件的方式来操作。

{
    "Name": "test_app", 程序名称
    "Start": "test_app.exe", 可执行文件
    "Source": "..\\test_app\\test_app\\bin\\Debug",可执行文件目录
    "Filter": [ ".exe", ".dll" ], 需要打包哪些后缀的文件
    "DesktopIcon": true,创建桌面快捷键
    "StartScreen": true,添加到开始菜单
    "InstallFolder": "C:\\Program Files",默认安装目录
    "OverrideExists": true,  生成的安装包会覆盖安装
    "Output": "test_app-installer.exe",  输出的安装文件是一个exe双击后执行安装流程
    "Uninstaller":"uninstaller.exe", 会在安装目录生成一个卸载程序
    "Icon":"favicon.ico", 
    "RegValues": [ 安装后写入注册表信息方便卸载、显示图标、版本信息等
        {
            "Type": "HKEY_LOCAL_MACHINE",
            "Path": "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall",
            "Name": "test_app",
            "Values": {
                "DisplayIcon": "${install_path}\\test_app.exe",
                "InstallLocation":"${install_path}",
                "DisplayName": "test_app",
                "DisplayVersion": "1.2.0",
                "Publisher":"tqz",
                "EstimatedSize":"${install_size}",
                "UninstallString": "${install_path}\\${uninstaller_file}",
                "NoModify":"1",
                "NoRepair":"1",
                "sEstimatedSize2":"${install_size}",
                "VersionMajor":"1",
                "VersionMinor":"2"
            }
        }
    ],
    "AfterInstall":"", 安装后执行操作,可以先放一些脚本在源文件,安装完成后调用
    "AfterRemove":""
}

配置内容还是基本满足需求,今天测试发现打包出来的exe不能执行了,先慢慢调试看看能不能拿出来用。

核心原理

简单说一下实现思路就是将数据写入exe的尾部后还能像没事人一样照常运行,根本不知道自己穿上了一件厚厚夹克衫。

制作安装包流程

  1. 就是我写好了一个可执行文件MakeInstall.exe,

  2. 用户写好了配置文件pack.json,

  3. 然后MakeInstall.exe会将自身复制一份,然后命名为安装程序installer.exe

  4. 根据配置文件将要打包的文件压缩写入installer.exe的文件尾部

  5. 将元数据、版本信息等写入installer.exe尾部

  6. 在尾部写标识installer.exe为安装包

安装流程

安装流程也就是自解压的一个过程,因为安装包的文件头部实际上就是MakeInstall.exe。执行后MakeInstall.exe会从自身的文件尾部读取元数据,然后认知到自己原来是一个安装包,再也不是原来的一个打包工具了。然后开始以下列操作。

  1. 从自身尾部读取数据、识别当前模式为安装流程

  2. 读取原始安装包大小,以及安装配置等信息。

  3. 展示界面,允许用户修改一些简单的安装信息。

  4. 从自身读取数据解压到安装目录,修改注册表

  5. 将文件头部的MakeInstall.exe复制一份命名为卸载程序uninstall.exe,尾部写入uninstall.exe的标识

卸载流程

卸载流程与安装流程类似,就是exe文件从自身读取数据然后进行操作就不再赘述了。

公告
本博客基于TinyBlog搭建,关注公众号CoderThing