2010-04-11 120 views
3

我是而不是对任何自动更新解决方案感兴趣,例如ClickOnce或MS更新程序块。对于任何感受冲动的人来说,为什么不问:我已经在使用这些东西,而且他们没有任何问题,我只想了解任何有效的替代品。如何使用修补程序更新应用程序文件?

我想发布补丁 =微小的差异,将用尽可能小的增量修改部署的现有文件。不仅需要修补代码,还需要资源文件。修补运行代码可以通过维护部署的两个单独的同步副本来完成(不需要对正在运行的可执行文件进行更改)。

应用程序本身可以被xcopy部署(以避免MSI自动更正修改的文件或打破ClickOnce签名)。

  • 我想学习如何处理不同版本的补丁(如存在发布了一个补丁,修复一个错误,后来另外一个补丁,修复另一个错误(在同一个文件) - 用户可以有任意组合这些可能会有第三个补丁 - 在文本文件中,这可能很容易实现,但可执行文件如何?(原生Win32代码与.NET,任何区别?)

  • 如果第一个问题太难以解决或无法解决的可执行文件,我想至少了解是否有一个解决方案实现简单的修补与串行修订 - 为了安装修订5,用户必须安装所有以前的修订版本以确保部署的有效性。

  • 这些修补程序可以从网站下载文件发布 - 不需要直接从正在运行的应用程序自动修补功能。

是否有任何现有的解决方案来实现这一点?

注意:有几个问题可能看起来像重复,但没有一个很好的答案。

这个问题是关于Windows平台,最好是.NET。

到目前为止,wyUpdate似乎最适合这个问题。仍然对替代品感兴趣。

+0

*很多*感谢链接到wyUpdate,我一直在寻找这样一个好的图书馆一段时间! – 2010-04-12 21:09:26

回答

6

您将不能创建可以应用到程序的多个版本的一个二进制补丁,所以以下情形将是不可能的:

 org+p1 
    / \ 
    + p1  +p2 <-- note, p2 is the same patch both places 
/  \ 
original  org+p1+p2 
    \  /
    + p2  +p1 <-- ie. the p2 on this line is the same as the one above 
    \ /
     org+p2 

实际上,您将有这样的场景:

 org v.2 
    / \ 
    +p1  +p4 <-- note, different patches now 
/  \ 
org v.1  org v.4 
    \  /
    +p2  +p3 
    \ /
     org v.3 

如果您希望允许用户挑选他们想要应用的修复程序,您应该很容易地看到这会变得多么复杂。是的,这可以通过文本文件完成,毕竟这是分支和合并如何与大多数源代码管理工具一起工作,但是它们的工作原理是,您可以在文件中插入和删除文件而不损害文件的其余部分,不适用于可执行文件。

注意:一个特殊情况是修复,替换字节,但不插入或删除任何文件。只要多个此类修复程序不重叠,就可以挑选您想要应用的修复程序。但是,这种补丁非常少见。

你应该,因为你已经在你的问题暗示,带有串行时间表工作,可能与单一修补程序,以现有版本,所以你可能有这个:

         +-- most up to date version 
             |    
             v 
org v.1   org v.3    org v.4 
    \   /  \   /
    +p1  +p2  +p3  +p4 
    \  /   \  /
     org v.2    org v.4 
     \ 
     +p1.1 
     \ 
      org v.2 hotfix 1 

至于实际的代码,我有diff/patch实现,但它可能远不是最优的。它目前需要很多时间才能为任何大小的文件生成补丁文件。这些补丁相当小,但我敢说其他算法会产生更好的补丁。使用bsdiff and bspatch进行的示例测试会生成较小的修补程序。

但是,如果你想玩它,代码是here。它是一个更大的类库的一部分,我不记得它有多少(库的其余部分)需要编译二进制补丁类,但它都在那里。您要使用的课程是Delta2课程。

+0

感谢您的详细分析和三角洲实施的链接。我将研究代码并尝试从中学习。 – Marek 2010-04-13 06:16:13

相关问题