前言

我们常常需要分发自己编写的软件,但是对于大部分情况来说,为了让用户能够使用我们的软件,用户都需要安装Runtime,我们常用的编程语言(Java,Python,Nodejs)等都需要安装对应的运行环境,他们的运行环境在一般的电脑上不一定安装过,在分发使用此类编程语言的程序时我们通常的做法是附带一份运行环境

但是这样做就会带来一个问题:众所周知,国内能在浏览器内直接下载文件的网盘少之又少,就算是qq群文件下载也十分慢,这大大影响了用户获取软件的体验

目标

快速制作一个小体积的在线软件安装包,该安装包能够快速分发,在安装时将会使用多线程的方式快速下载运行环境完成安装

本文将以mirai项目的Windows一键安装包为例来举例如何使用WinRAR完成我们的目标

效果展示

mirai是一个使用jvm的qq机器人项目,要运行他首先需要安装java和javafx

以下是效果图

点击安装之后将会打开一个cmd窗口,程序将会自动执行运行环境和jar的下载

自解压文件结构如下

开始

第一步:存放我们的文件

本项目使用coding来存储文件,使用方法很简单

  1. 在coding创建一个仓库
  2. 将仓库设置为公开
  3. 上传文件至仓库
  4. 在文件预览界面点击下载并复制下载连接

这一步很简单,不贴图了,理论上gitee和GitHub也可以这样使用

如果提供商有文件大小限制,请创建压缩分卷再上传

完成下载

要进行文件下载,虽然我们完全可以编写一个自己的小程序来完成该任务;但是我不认为这是非常快的方法。现成的下载软件很多,我们可以使用aria2快速下载

aria2 is a lightweight multi-protocol & multi-source command-line download utility. It supports HTTP/HTTPS, FTP, SFTP, BitTorrent and Metalink. aria2 can be manipulated via built-in JSON-RPC and XML-RPC interfaces.

这是官网对该软件的介绍,选择它的原因主要有以下几个

  1. 多线程下载
  2. 命令行操作
  3. 轻量,它的Windows版本只需要一个4m左右的exe

将他集成到我们的在线安装包里并使用他来下载我们的文件是个不错的选择

你可以使用下面的命令来下载文件

1
2
3
4
@echo off
.\aria2c.exe --max-concurrent-downloads=4^
-U "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"^
--input-file=urls.txt

请将你的链接放到urls.txt里,使用这个bat就可以进行下载

完成解压

有了上一步的经验,在解压环节我们可以使用7z来完成

7z有命令行操作功能,并且只需要7za.dll7za.exe两个文件即可工作,两个文件大小总和不超过1m,这是我们理想的嵌入解压工具

使用下面的命令来解压文件

1
7za.exe x 文件名称 -aoa

其中x表示解压,-aoa表示覆盖文件,如果你的文件是压缩分卷则只需要填写分卷的第一个文件即可正确完成解压

解压完成后你可以删除剩下的文件

1
del 文件.z*

这样可以删除全部的zip分卷文件,其他同理

完成自动安装

有了安装脚本,下一步要做的就是在自解压完成后自动开始安装

它十分简单

WinRAR的自解压文件可以将你的压缩包打包为exe格式,你可以在任何位置直接打开它而无需提前安装压缩软件,这对于想把软件安装到服务器的用户十分友好

提取后运行的脚本默认工作目录为解压出的文件位置

到此,你就创建了一个解压后可以自动完成运行环境下载的自解压文件了

说明信息的更改

啊,我知道啊,在这里填上信息

实际上直接填入显示的文本是不行的,你会发现他的格式全都是乱的。。。。

原因在于,你需要使用html填写

既然是快速,那就不写html了,除非你对html十分熟悉

我们可以使用word来导出html

  1. 打开一个新的word文档
  2. 在里面输入你想要的提示信息
  3. 在另存为里选择html格式

  4. 使用WinRAR的从文件加载文本加载该html

完成

到此你就完成了你的在线安装文件,你可以使用预设功能保存WinRAR的设置便于下次使用

进阶

安装数量统计

我们可以使用网站访问统计服务来统计安装包安装数量,只需要使用aria2发送计数请求即可

这里需要注意aria2默认是多线程请求的,要用于计数请设置为单线程

代码不贴了,很简单