MSM(合并模块)的修补程序(次要升级)创建问题

时间:2015-02-19 18:16:27

标签: wix windows-installer patch wix3.6 msiexec

我遇到与MSM(合并模块)的补丁(次要升级)安装(更新)问题。 我正在使用texst.wxs创建MSI(test.msi)。在text.wxs里面引用app.msm文件(有一个文件夹应用程序,其中包含很多文件夹和文件。并且收集此文件夹并生成app.msm文件)

以下是制作app.msm文件的步骤。

heat dir "app" -gg -sfrag -template:module -srd -ke -var var.source -out app.wxs
candle -dsource=app app.wxs
light app.wixobj

以下是test.wxs文件的片段

<Directory Id='TARGETDIR' Name='SourceDir'>
<Directory Id='ProgramFilesFolder' Name='PFiles'>
....
....

    <Directory Id='Config' Name='Config'>
       <Component Id='APP_CLIENT' Guid='*'>
           <Component Id='Manual' Guid='*'>
                <File Id='Manual' Name='Manual.pdf' DiskId='1' Source='Resources/Manual.pdf'
                  KeyPath='yes'>
                    <Shortcut Id="startmenuManual" Directory="ProgramMenuDir" 
                          Name="Instruction Manual" Advertise="yes" />

                </File>
            </Component>                                           
        </Directory>    

    <Directory Id='exmp_REPO' Name='!(loc.Merge_FolderTitle)'>
        <Merge Id="LocalRepository" Language="1033" SourceFile="app.msm" DiskId="1"/>                       
            <Component Id='exmp_REPOSITORY' Guid='*'>       
                 <CreateFolder/>    
                 <RemoveFolder Id='exmp_REPO' On='uninstall' />
            </Component>
        </Directory>            

...

<Feature Id='Complete' Display='expand' Level='1' ConfigurableDirectory='MYAPPPATH'>
    <ComponentRef Id='Manual'/>
    <ComponentRef Id='App_CLIENT'/>
    <ComponentRef Id='exmp_REPOSITORY'/>

... ...

我可以使用app.msm(合并模块)使用我的test.wxs进行重大升级。但是无法通过成功安装进行修补。补丁安装(更新)反映了&#34;程序和功能&#34;中的版本更改。并显示在&#34;查看已安装的更新&#34;。手动更改也反映了修补程序更新。但无论&#34; app&#34; (它们是在app.msm中创建并在test.wxs中引用的)文件夹没有反映出来。

我使用了两种制作补丁的方法,这些方法在下面的网址中是mentioend

1)http://wixtoolset.org/documentation/manual/v3/patching/patch_building.html

2)http://wixtoolset.org/documentation/manual/v3/patching/wix_patching.html

请在这方面提供帮助。

4 个答案:

答案 0 :(得分:1)

首先,我建议找出内置补丁是否包含正确的文件。如果没有,您有一个构建问题,即msm未更新。如果是,则很可能是msm的内容有问题,这可能与它的前任不一致(尤其是GUID,表主键等)。
您可以使用Orca和Insted等可以搜索和下载的工具查看并查看补丁的内容,而不用进行安装。

其次,使用合并模块是非常复杂的事情,特别是对于补丁,并且有用性有限,如果它们是您自己的并且您只使用它们一次。 Msms主要用于需要至少2个不同MSI包的.msm的情况。我已经看到在使用其他工具BTW的补丁中使用合并模块的一些问题。我对WiX +补丁+ MSM没有特别的经验,但就像我说的那样。

最后,但并非最不重要的是,如果你真的想在未来保持这种复杂性,你将不得不选择。我记得,WiX还有其他可能来模块化/封装你的软件部分。

答案 1 :(得分:1)

您可以通过使用Orca打开它们并查看File表来检查合并模块和MSI文件中的文件版本。或者使用Orca打开MSI文件,然后使用Transform =&gt;查看修补程序以查看更改。

可能很明显,但二进制版本的文件将被具有更高文件版本的文件替换。我提到,因为有一种信念,不知何故“新”文件取代“旧”文件,这是错误的。版本很重要。

通常,您需要使用msiexec命令安装补丁,该命令指定REINSTALL = ALL REINSTALLMODE = omus。双击MSP文件不一定能正常工作,除非您已安排它在内部执行此操作,并在设置PATCH时设置自定义操作。

如果破坏组件规则,该补丁将无效。一个常见的错误是在修补程序中删除组件,这将导致“广告”更新,实际上不会更新任何内容。在详细日志中查找SELMGR条目,不支持有关删除组件的文本。如果您已完成此操作,则将MSIENFORCEUPGRADECOMPONENTRULES属性设置为1将使修补程序失败。

如果文件没有版本,是否覆盖取决于此处的替换规则,如果文件是否经过哈希处理则有一些区别:

https://msdn.microsoft.com/en-us/library/aa370531(v=vs.85).aspx

另外:你怎么知道这个补丁不起作用?如果您没有文件版本,那么除非您仔细查看,否则您无法知道文件是否已被替换。您无法信任日期,因为Windows会在安装文件时更改时间戳。您确实需要使用文件版本构建二进制文件,因为补丁,修补程序,服务包等所有内容都将使用它们来替换二进制文件。否则对于数据文件使用文件散列。

答案 2 :(得分:1)

我在这里看到了几个潜在的问题,甚至可能除了其他答案之外:

  1. 当您为合并模块加热文件时-gg自动生成新的组件guids。这不适用于补丁,因为它基本上会添加一堆新组件(每次新的guid !!)。此外,您将以这种方式删除组件,这是您不应该做的事情,除非您仍然包含原始合并模块,否则无法轻松完成。然后你最终会遇到路径问题。
  2. wix修补教程使用wixpdb文件来区分原始安装程序和更新的安装程序。使用wixpdb文件时,无论是否更改了文件,都不会修补合并模块。您需要进行管理安装,然后在msi上进行diff。你还有问题#1。
  3. 你的wxs片段很糟糕。至少xml元素永远不会正确关闭。您的功能还有某个MergeRef?
  4. 一些提示:

    • 您可以使用名为Orca的程序查看修补程序的功能。打开原始的msi,然后只需将msp补丁文件拖到它上面。
    • 而不是使用合并模块,它们使事情复杂化。您也可以使用heat来生成一个片段,然后将其简单地包含在您的wix项目中。
    • 使用wix修补方法(Patch元素,而不是PatchCreation元素)。它更容易,但你有相同的控制
    • 如果您计划使用修补程序更新这些自动生成的组件,请
    • 不自动生成guid。它不会成为主要升级的问题:)

答案 3 :(得分:0)

文件未正确更新时,只有一个重要的问题有很多可能的原因:你在.msm中写的是大量无版本文件,如.xml等。
重要规则:
在第一次MSI安装之后在PC上更改的每个未版本控制的文件不是由MSI引擎本身安装的(例如,您编辑了一个config.xml文件),MSI通常不会再次更新,而不是通过补丁而不是主要升级。 (通常我的意思是,您必须采取特殊操作,例如卸载或特别指定这些文件作为所谓的伴随文件)。