【问题标题】:Patch (minor upgrade) creation issues with MSM (merge modules)MSM(合并模块)的补丁(次要升级)创建问题
【发布时间】:2015-04-21 05:47:12
【问题描述】:

我在使用 MSM(合并模块)安装(更新)补丁(次要升级)时遇到问题。 我正在使用 texst.wxs 创建 MSI (test.msi)。而text.wxs里面指的是app.msm文件(有一个文件夹app,里面有这么多的文件夹和文件。然后收割这个文件夹,制作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文件的sn-p

<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 进行重大升级。但无法成功安装补丁。补丁安装(更新)反映在“程序和功能”中的版本更改并显示在“查看已安装的更新”中。手动更改也反映在补丁更新中。但无论“app”(创建 app.msm 并在 test.wxs 中引用)文件夹中的任何更改都没有反映。

我使用了2种方法来制作补丁,在下面的url中提到了

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

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

请在这方面提供帮助。

【问题讨论】:

    标签: wix patch wix3.6 windows-installer


    【解决方案1】:

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

    1. 当您为合并模块加热文件时,-gg 会自动生成新的组件 guid。这不适用于补丁,因为它基本上会添加一堆新组件(每次都有新的指导!!)。此外,您将以这种方式删除组件,这是您不应该做的事情,也不容易做到,除非您仍然包含原始合并模块。然后你会遇到路径问题。
    2. wix 修补教程使用 wixpdb 文件来区分原始安装程序和更新的安装程序。使用 wixpdb 文件,合并模块将不会被修补,无论文件是否更改。您将需要进行管理安装,然后在 msi 本身上进行比较。您仍然会遇到问题 #1。
    3. 你的 wxs sn-p 坏了。至少 xml 元素永远不会正确关闭。您的 Feature 在某处也有 MergeRef?

    一些提示:

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

    【讨论】:

      【解决方案2】:

      您可以通过使用 Orca 打开并查看文件表来检查合并模块和 MSI 文件中的文件版本。或者使用 Orca 打开 MSI 文件,然后使用 Transform=>View patch 查看更改。

      这可能很明显,但二进制版本的文件将被具有更高文件版本的文件替换。我提到是因为人们相信“新”文件会以某种方式取代“旧”文件,这是错误的。版本很重要。

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

      如果您违反组件规则,补丁将无法工作。一个常见的错误是在补丁期间删除组件,这将导致“广告”更新实际上不会更新任何内容。在详细日志中查找 SELMGR 条目,不支持有关删除组件的文本。如果您这样做,将 MSIENFORCEUPGRADECOMPONENTRULES 属性设置为 1 将使补丁失败。

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

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

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

      【讨论】:

      • 正如我所说,有用的提示。投入我的两分钱:仅添加 REINSTALL=ALL 在某些安装情况下确实非常有帮助,尤其是在分析像这里这样的错误时。 (对于高级用户:通常情况下,精心设计的补丁不需要它,此外,在极少数情况下,如果您有针对不同场景的可选功能并且补丁中的新文件绑定到可选功能,则 REINSTALL=ALL 可能会出现问题。以防万一你没有这么复杂的设置设计,REINSTALL=ALL 就可以了。)
      • @PhilDW : 1) 我通过打开 ORCA 检查了我的 .msm 文件。在表-> 文件中:对于每个文件,它不显示版本号。这是问题吗?如何为这些文件设置版本? 2) 我正在安装 REINSTALL=ALL REINSTALLMODE=omus。 3)我不是在修改文件夹,只是在更改文件(或文件内容)
      • @PhilDW 谢谢。该补丁不包括我的合并模块文件(这是我使用 heat 命令生成的)。有没有办法(除了合并模块)将收获的文件添加到我的 test.wxs 文件中?我尝试在热量中使用 ComponentGroupRef 如下方式:::: heat dir "app" -cg MyFiles -gg -g1 -sf -scom -sreg -sfrag -srd -out app.wxs -var var.source -ke ::: :. Candle -dsource=app app.wxs 工作正常。但是 light app.wixobj 抛出错误:light.exe:错误 LGHT0093:在提供的中间体列表中找不到条目部分。预期类型为“未知”的部分
      • @mallikgm 你能解决错误“LGHT0093:在提供的中间体列表中找不到条目部分。预期类型为“未知”的部分
      【解决方案3】:

      文件未正确更新的许多潜在原因中的一个重要问题:您在 .msm 中写入了大量未版本化的文件,例如 .xml 等。
      重要规则:
      在第一次安装 MSI 后,不是由 MSI 引擎本身(例如,您编辑了一个 config.xml 文件左右)在 PC 上更改的每个未版本化文件,通常不会再由 MSI 更新,不是通过补丁也不是通过主要升级. (通常我的意思是,您必须采取特殊措施,例如卸载或特别将这些文件指定为所谓的伴随文件)。

      【讨论】:

        【解决方案4】:

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

        其次,使用合并模块会使事情变得非常复杂,特别是对于补丁,并且如果它们是你自己的并且你只使用它们一次,那么它们的用处有限。 Msms 主要用于需要 .msm 至少用于 2 个不同 MSI 包的情况。顺便说一句,我在其他工具的补丁中看到了一些使用合​​并模块的问题。我在这里对 WiX+补丁+MSM 没有什么特别的经验,但是,正如我所说的。

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

        【讨论】:

        • 谢谢菲尔姆。对于第一个,我如何检查构建的补丁是否包含正确的文件?我已经对 Manual.pdf 更改和 app.msm 中的其他更改进行了修补(来自 app 文件夹,其中包含 100 个内部文件夹和 1000 多个文件,即 jars、xmls、...)。并安装/更新补丁。 Manual.pdf chagnes 被反映,但 app.msm(即 app 文件夹)的变化没有反映?
        • 我使用合并模块作为 InstallShield / WiX 世界中的一种封装形式,就像 WiX 为此目的使用片段一样。但我在这里有偏见……我不喜欢 Windows Installer Patching。这是一个非常复杂的黑魔法主题,我认为 99% 的人永远不需要。在我的模式中,我将合并模块与主要升级结合使用。问问自己你是否真的需要打补丁,如果答案是肯定的,那么请学习打补丁的方法,不要尝试像 Heat 那样走捷径。结局不太可能。
        • 感谢克里斯托弗的回复。对我来说,主要升级可以很好地处理热量(即合并模块)。但是在小升级(即补丁)方面存在问题。它不工作。但目前不确定如何不合并模块。因为我有一个文件夹(比如应用程序),其中包含很多文件夹和文件,所以首先制作 MSI 我正在制作合并模块并在我们的主 wxs 源文件中引用它。
        • @mallikgm。正如我告诉你的:你已经建立了一个 .msp 文件,不是吗?这当然绑定到原始 .msi 文件。下载其中一个工具并使用该工具加载 .msi 文件。然后有一个用于查看补丁的菜单项。例如在 InstEd 中,它位于菜单“Transform / View patch”中。然后查看文件表,您可以在其中看到补丁更改的行(文件)以及这些文件的大小和版本。
        • 然后,以您的 MSM 的一个文件示例(应该已更改的文件)并查找它。正如我所说,如果文件表中的行仍然没有变化,那么在补丁构建期间您的新 MSM 将被简单地忽略,您必须更改生成 msp 的方式。换句话说,这可以帮助您找出构建时间或安装时间问题。
        猜你喜欢
        • 2015-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2016-11-07
        相关资源
        最近更新 更多