不幸的是,无论我如何搜索,我都找不到有关此过程的信息。似乎已经实施的自动更新程序要么是专有的,要么不被认为很重要。
看起来很容易实现在网络上寻找更新并在可用时下载它们的系统。这个自动更新程序的那部分将从实现到实现变化很大。问题是应用补丁的不同方法是什么。只是下载文件并用新文件替换旧文件、运行已下载的迁移脚本、猴子补丁系统的某些部分等等?概念优先,但Java、C、Python、Ruby、Lisp等语言的示例将不胜感激。
我认为“语言无关”将成为一个限制因素。 应用程序有各种不同的形状和尺寸,因此没有一种通用的答案。 我已经在几种不同的编程语言中实现了几个自动更新器,但其中没有两个相似。
最常见的方法是应用程序通过某个主页位置(网络地址、网络查询、企业网络位置等)检查它的版本是否最新,如果需要更新,则每个情况下的更新过程都不同。
另一种流行的方法是邀请主页位置在应用程序启动时运行脚本。该脚本可以检查版本,如果需要则下载更新,并请求使用反馈。
如果您缩小参数范围,我们可能可以提供更好的帮助。
更新:修补程序的方法也取决于应用程序的性质,在这里有非常广泛的多样性。例如,如果您只有一个可执行文件,则替换可执行文件可能是最实际的方法。 如果您的应用程序有许多文件,则应寻找最小化替换文件数量的方法。 如果您的应用程序高度定制或参数化,则应尽力最小化重新定制的工作量。 如果您的应用程序采用解释性代码(例如Excel VBA应用程序或MS Access MDB应用程序),则可以替换代码的部分内容。 在Java应用程序中,您可能只需要替换一个JAR文件,甚至是JAR文件的子集。 您还需要一种识别当前客户端版本并适当更新的方法。 我可以继续说下去,但我希望您能理解我关于多样性的观点。 这是许多情况下最好的答案通常以“哦,这要看......!”开始的原因之一。 这就是为什么许多答案都包括“请缩小参数范围”的原因。
请确保考虑关于获取更新信息以及更新二进制文件的安全性问题。
您信任下载来源吗?您可能正在向一个服务器请求获取更新,但如果有“中间人”将您重定向到恶意服务器会怎样呢?使用 HTTPS 或类似的安全连接可以帮助防范此类攻击,但建议通过数字签名检查来双重确认最终下载的位是否安全。
首先,您需要在应用程序主页网站上拥有一个包含最新版本的文件。我认为最好的方式是创建一个专门的SQL表格来完成这个任务,并在发布新版本/夜间构建完成后自动填充它。 您的应用程序会创建一个新线程,请求内置的http链接以获取版本号并将其与当前版本进行比较。在.NET中,您可以使用以下代码:
Version GetLatestVersion() {
HttpWebRequestrequest = (HttpWebRequest)WebRequest.Create(new Uri(new Uri(http://example.net), "version.txt));
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
if (request.HaveResponse)
{
StreamReader stream = new StreamReader(response.GetResponseStream(), Encoding.Default);
return new Version(stream.ReadLine());
}
else
{
return null;
}
}
Version latest = GetLatestVersion();
Version current = new Version(Application.ProductVersion);
if (current < latest)
{
// you need an update
}
else
{
// you are up-to-date
}
许多程序都采用最简单的解决方案:运行旧版本的卸载程序,然后运行新版本的安装程序(可选择跳过用户已经回答过的问题,如最终用户许可协议)。唯一的问题是,新版本必须能够从旧版本中读取配置选项。
此外,在Windows操作系统上,您无法删除正在使用的可执行文件,因此您可能需要在Temp文件夹中放置一个小型可执行文件,该文件运行整个过程,然后从启动的新版本实例中删除它(或者仅注册以在下次重新启动时删除)。
还有一件事情没有被提到,那就是你应该认真考虑运行程序的用户可能没有足够的权限来升级它。对于企业用户来说,这应该相当常见,对于家庭用户来说可能较少。
出于安全原因,我总是使用(自我限制的)受限帐户进行工作,而且最让我恼火的是,大多数自动更新程序只是假设我正在以管理员身份运行,然后在下载后失败,除了实际关闭程序并以管理员身份重新运行之外,没有其他执行更新的方式。大多数甚至不会缓存已下载的更新,必须重新开始全部操作。
如果自动更新程序需要时简单地提示管理员凭据并继续进行将会更好。
我假设您是在使用Windows操作系统。
以下方法似乎很有效:
在安装程序中执行以下步骤:
1. 创建一个手动启动的服务,以LocalSystem身份运行,当启动时执行更新操作,然后停止。
2. 更改服务权限,使所有用户都可以启动该服务(如果所有用户都应该能够在没有管理员权限的情况下进行更新)。
3. 更改主程序,使用简单的机制在启动时检查更新。如果检测到更新,提示用户是否要应用它。
4. 如果用户接受更新,请启动服务。
如果架构允许,创建一种监视更新进程的方式。