处理对程序更新过程的更改
Handling changes to a program's update process
我有一个应用程序有自己的更新过程。我自己写的,因为我不想使用 ClickOnce 并且当时不了解 Squirrel。更新过程如下:
- 存档当前版本
- 从远程位置下载 ZIP 包
- 检查清单文件的文件版本并进行比较以确定是否存在更新
- 将 ZIP 内容解压到暂存位置
- 重命名被替换的文件,在末尾附加 _Delete
- 将文件从暂存区复制到根目录
- 删除暂存目录
我只复制了DLL文件、EXE和MANIFEST文件。其他文件是我不想覆盖的各种设置文件。
有一些请求的功能需要添加到其中一个设置文件中,但我不知道如何在当前更新过程中提供此类功能。我唯一能想到的是在更新过程中建立某种 "minimum version" 功能,因此在从版本 A 转到 C 之前,您必须先下载 B。然后有单独的版本,其中一个用于更新过程,下一个用于请求的功能。
最后一项是这些不是自动更新。用户通过显式检查更新并说他们想要更新(如果存在)来选择加入。远程位置只有一个 ZIP 文件,而不是每个版本发布一个 ZIP 文件。
关于我应该如何进行这些更改有什么想法吗?现在有一个小的用户群,所以无论需要什么,我都愿意听到。
我的理解是您的更新过程能够覆盖二进制文件,现在它需要 "merge" 文本文件(设置),例如在现有设置旁边添加新设置而不覆盖现有设置的值设置。
在这种情况下,我建议您对新设置使用默认值。这是一个例子:
在 1.0 版中,您提供数据库连接的设置。
在 1.1 版中,您添加了一个新设置来控制 timeout
并更新了设置文件。您的代码应检查设置文件中是否已存在该值,如果存在则使用它,否则将其设置为您选择的默认值——比如 5 秒;这存储在内存中(硬编码)。您可以选择将此值写入设置文件(如果不存在),让用户知道有可用的新设置。
这给你带来了什么:
安装 1.1 的用户(之前没有安装过 1.0)获得 timeout
设置为 5 秒的设置文件。
从 1.0 升级到 1.1 的用户会保留他们现有的设置文件,当 1.1 运行时您可能会更新也可能不会更新
您可以从任何版本更新到最新版本,因为您的代码始终定义设置的默认值,即使它们不存在于设置文件中。
我有一个应用程序有自己的更新过程。我自己写的,因为我不想使用 ClickOnce 并且当时不了解 Squirrel。更新过程如下:
- 存档当前版本
- 从远程位置下载 ZIP 包
- 检查清单文件的文件版本并进行比较以确定是否存在更新
- 将 ZIP 内容解压到暂存位置
- 重命名被替换的文件,在末尾附加 _Delete
- 将文件从暂存区复制到根目录
- 删除暂存目录
我只复制了DLL文件、EXE和MANIFEST文件。其他文件是我不想覆盖的各种设置文件。
有一些请求的功能需要添加到其中一个设置文件中,但我不知道如何在当前更新过程中提供此类功能。我唯一能想到的是在更新过程中建立某种 "minimum version" 功能,因此在从版本 A 转到 C 之前,您必须先下载 B。然后有单独的版本,其中一个用于更新过程,下一个用于请求的功能。
最后一项是这些不是自动更新。用户通过显式检查更新并说他们想要更新(如果存在)来选择加入。远程位置只有一个 ZIP 文件,而不是每个版本发布一个 ZIP 文件。
关于我应该如何进行这些更改有什么想法吗?现在有一个小的用户群,所以无论需要什么,我都愿意听到。
我的理解是您的更新过程能够覆盖二进制文件,现在它需要 "merge" 文本文件(设置),例如在现有设置旁边添加新设置而不覆盖现有设置的值设置。
在这种情况下,我建议您对新设置使用默认值。这是一个例子:
在 1.0 版中,您提供数据库连接的设置。
在 1.1 版中,您添加了一个新设置来控制
timeout
并更新了设置文件。您的代码应检查设置文件中是否已存在该值,如果存在则使用它,否则将其设置为您选择的默认值——比如 5 秒;这存储在内存中(硬编码)。您可以选择将此值写入设置文件(如果不存在),让用户知道有可用的新设置。
这给你带来了什么:
安装 1.1 的用户(之前没有安装过 1.0)获得
timeout
设置为 5 秒的设置文件。从 1.0 升级到 1.1 的用户会保留他们现有的设置文件,当 1.1 运行时您可能会更新也可能不会更新
您可以从任何版本更新到最新版本,因为您的代码始终定义设置的默认值,即使它们不存在于设置文件中。