14

我目前有一个项目,其中包含我使用 NSIS 制作的安装程序,但我希望更新到仅包含更改文件并显示更改日志的新版本。目标平台是windows。你有什么方法/建议可以做到这一点?

4

6 回答 6

14

您可能需要重新考虑使用 NSIS。如果您正在修补和分发更新,您可能会从使用利用 Windows Installer 功能 (msiexec) 的安装程序技术中获得最大的好处。

NSIS 基本上是一个运行并执行您想要的程序的程序,而 Windows Installer 类型的安装程序强制您将应用程序拆分为可由 Windows Installer msi 服务管理的功能和组件。MSI 将跟踪您安装了哪些版本的产品、再次运行安装程序是否会在维护模式下运行、是否允许您安装 2 个不同版本的产品、补丁是否可以应用于产品的特定版本或与更新和安装有关的任何其他问题。

基本上,如果您更改为 Windows Installer 技术,您请求的大部分内容都可以立即使用。而如果您使用 NSIS(不使用 Windows Installer 技术),那么您将不得不自己实现它。

举个例子,有一个非常全面的安装程序生成器,称为 AdvancedInstaller ( http://www.advancedinstaller.com/ ),听起来像您想要的。或者,如果您想在余生中搜索论坛和新闻组,那么有一个名为 WiX 的开源产品可以做类似的事情;)

于 2010-05-27T14:02:23.237 回答
6

尽管我之前发表了评论,但我已经使用 NSIS 编写了一个 5000 行的安装程序,并带有 13 个自定义页面。我什至看过补丁,它有点像黑客。主要的建议是确保您正在修补您认为正在修补的版本,然后使用可用的修补插件之一。

有几种补丁技术可以比较文件并生成补丁更改文件以及“安装”它们所需的 NSIS 代码。我发现 NSIS Patch Gen 以最少的麻烦完成了我想要的工作。文档有点薄,但一旦你弄明白了,你就会想“哦,是的”。

自动生成的更改日志可能会给您带来一些麻烦。我建议您自己创建更改日志(或至少在您所做的每个应用程序更改中添加额外的更改)并将其包含在内,就好像它是一个普通的应用程序文件一样,并让补丁生成器更新它。

http://sourceforge.net/projects/nsispatchgen/

于 2010-11-12T11:06:37.030 回答
2

一种可能的方法是在您的下载服务器上存储一个 XML 文件,该文件具有每个已发布的版本以及每个版本更改的文件列表。安装程序会在安装它所安装的文件版本时编写一个注册表项。

然后,在更新时,安装程​​序会下载并解析 XML 文件,并找到版本号高于当前安装的任何节点。您在安装程序页面上的文本框中显示所有文件,当用户确认时,安装程​​序会下载所有文件,然后将注册表更新到最新版本。

于 2009-06-16T12:21:22.270 回答
1

你熟悉 cURL 吗? http://www.shininglightpro.com/products/Win32OpenSSL.html http://curl.haxx.se/download.html#openssl

它将下载任何协议,您可以使用它来下载文件。这是一个命令行应用程序。

在安装程序中,安排一个程序,该程序应首先检查主程序是否正在运行,如果没有运行则退出,调用 curl 从您的站点下载包含更新的批处理文件,然后运行该批处理文件。
它下载的批处理文件通过使用 curl 下载正确的文件来更新应用程序。该过程应该每两周或每月运行一次,具体取决于您更新的频率。

安装程序的卸载部分应该能够删除相关应用程序的所有部分,包括任何更新。这可以通过从程序文件的该子目录中删除所有文件来完成。

RMDir /r /REBOOTOK '$INSTDIR'
RMDir /r /REBOOTOK "$SMPROGRAMS\$StartMenuFolder"
Delete '$SMPROGRAMS\$StartMenuFolder\gpl3license.lnk'
Delete '$SMPROGRAMS\$StartMenuFolder\readme.lnk'
Delete '$SMPROGRAMS\$StartMenuFolder\${PRODUCT_TITLE}.lnk'
DeleteRegKey HKCU "Software\Your major subkey\${PRODUCT_NAME}"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
DeleteRegKey /ifempty HKCU "Software\${PRODUCT_NAME}"

PRODUCT_NAME 是我制作的 !define,因为我将这些 nsi 文件用作模板。这只是安装程序文件的卸载程序部分的一部分。

于 2012-04-07T21:01:04.057 回答
0

通过将应用程序发布到我的个人 CDN(或某些托管平台)并利用 Node.js 模块(如path替换),我已经能够为我的 Windows 应用程序(使用 NSIS 作为其安装程序的 CLI)创建补丁更新程序来自 CDN 的具有给定版本的二进制文件(使用与equinox.io类似的过程)并winreg相应地更新 Windows 注册表。因为我已经命名了我的 Windows 注册表项,所以卸载程序仍然可以使用它。

如果有人想了解这方面的更多细节,请询问。我很乐意提供帮助。

于 2019-08-08T17:46:19.353 回答
-1

即使您更改了一小部分代码,某些编译器(例如 Delphi)也会在最终的可执行文件中进行大量更改。

所以首先你应该看看它是否值得修补。

另一个考虑因素是补丁本身。某些防病毒软件可能会阻止修补程序,特别是在某些系统文件夹中。

最后,增量修补数据的大小可以超过原始文件。

基于以上主题,我不建议你修补。改用完整的安装程序

于 2011-05-24T06:48:15.880 回答