2009-06-13 84 views
9

我目前有一个使用NSIS制作的安装程序的项目,但是我希望对只有已更改文件的新版本进行更新,并显示更新日志。目标平台是windows。你需要做什么方法/建议?如何使用NSIS创建更新安装程序?

+0

您是否完成了项目?最后你用了什么?也许你可以接受其中一个答案:) – 2013-01-18 16:54:10

+0

是的,我完成了它...但我没有使用任何这些方法,因为它比我想要的更复杂。所以我只是做了一个完整版本的更新版本,并要求用户在让应用程序运行之前下载它们。 – staackuser2 2013-01-18 20:20:39

+0

我刚接受你的答案...即使我没有使用它,它看起来像可用的最佳方法。 – staackuser2 2013-01-18 20:23:09

回答

12

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

NSIS基本上是运行,你想要做而Windows安装程序类型安装强迫你分割你的应用程序为可通过Windows安装程序MSI服务管理功能和组件有什么计划。 MSI将跟踪您已安装的产品版本,无论是再次运行安装程序将以维护模式运行,是否允许安装2种不同版本的产品,是否可以将修补程序应用于特定版本的产品或有关更新和安装的任何其他问题。

基本上大部分的您请求将提供的东西,如果你切换到Windows安装程序技术外的开箱。而如果你使用NSIS(不使用Windows Installer技术),那么你将不得不自己实现它。

只是作为一个例子有一个名为AdvancedInstaller(http://www.advancedinstaller.com/)一个非常全面的安装程序生成器,听起来像你想要什么。 另外,如果你想花你的生活拖网论坛和新闻组的其余部分,那么有一个名为WiX的开源产品做类似的事情)

1

一种可能的方式是存储有每个发行版本,并且改变了每个版本的文件列表的下载服务器上的XML文件。安装程序会在安装所安装文件的版本时编写注册表项。

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

3

尽管我以前的评论我写了一个5000行安装程序使用NSIS有13个自定义页面。我甚至看过补丁,这有点破解。主要的建议是确保你修补你认为你正在修补的版本,然后使用一个可用的修补插件。

有几种修补技术,比较文件和补丁产生改变文件和“安装”它们所需的NSIS代码。我发现NSIS Patch Gen以最少的麻烦做了我想要的东西。该文件有点薄,但一旦你发现它,你会想“哦,你好”。

您可能会对自动生成的更改日志有点麻烦。我建议你自己创建更改日志(或者至少在每次更改应用程序时添加更多的更改),并将其包含为正常应用程序文件,然后让修补程序生成器对其进行更新。

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

0

像德尔福有些编译器让很多在最终的可执行文件的变化,即使你改变你的代码的一小部分。

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

另一个考虑是自行修补。 修补可能被某些防病毒软件特别在某些系统文件夹中阻止。

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

基于上述问题,我不建议你打补丁。 使用完整安装程序代替

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是我定义的!因为我使用这些nsi文件,就像模板一样。 这只是安装程序文件的卸载程序部分的一部分。