我遇到与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
请在这方面提供帮助。
答案 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)
我在这里看到了几个潜在的问题,甚至可能除了其他答案之外:
一些提示:
答案 3 :(得分:0)
文件未正确更新时,只有一个重要的问题有很多可能的原因:你在.msm中写的是大量无版本文件,如.xml等。
重要规则:
在第一次MSI安装之后在PC上更改的每个未版本控制的文件不是由MSI引擎本身安装的(例如,您编辑了一个config.xml文件),MSI通常不会再次更新,而不是通过补丁而不是主要升级。 (通常我的意思是,您必须采取特殊操作,例如卸载或特别指定这些文件作为所谓的伴随文件)。