有人可以在以下情况中解释奇怪的MSI行为:
我有多个Wix项目,它们共享包含单个组件的相同功能:
<Feature Id="VTWSK" Level="1" Directory="MyCommonFolder">
<Component Id="vtwsk" Guid="{47EC2941-738D-4486-9D86-A443A40C5F94}" Directory="TempDriversFolder">
<File Id="vtwsk.key" Source="..." KeyPath="yes"/>
...
</Component>
</Feature>
我确保所有产品都将MyCommonFolder解析为同一目标目录,以便组件密钥路径确实相同。我还有一个自定义操作,应该在时执行,并且仅当组件首次安装在目标计算机上时,所以我使用以下条件:
<InstallExecuteSequence>
<Custom Action="InstallVTWSK" After="InstallFiles">$vtwsk=3</Custom>
</InstallExecuteSequence>
当第一个产品安装在目标计算机上时,它可以正常工作,但是,第二个产品无法检测到已经安装了vtwsk组件。来自第二个产品安装的日志:
MSI (s) (B0:AC) [13:18:22:202]: Feature: VTWSK; Installed: Absent; Request: Local; Action: Local
...
MSI (s) (B0:AC) [13:18:22:202]: Component: vtwsk; Installed: Absent; Request: Local; Action: Local; Client State: Unknown
因此,组件状态仍然是3,并且第二次执行相应的自定义操作(并且由于我无法轻易控制其性质而失败)。我宁愿期待&#34;已安装:本地;要求:本地;行动:空虚&#34;。
是否有可能仅在首次在目标计算机上安装组件(或功能)时有条件地运行自定义操作?
答案 0 :(得分:2)
所有其他事情都是正确的,发生的事情是每次都安装组件,以便条件成立。仍然有两到三个产品安装该组件,并且该位置的引用计数增加,并且存在一个文件的事实不相关。每个产品仍在安装该组件。您确实希望在第一次安装文件时运行该CA.我会考虑让CA创建一个注册表项,说明文件已初始化,并使用它来查看是否需要初始化。或者以其他方式使CA足够聪明,看到初始化已经完成,所以你每次都要调用它。或者,如果文件存在的事实足够,那么您可以搜索文件的组件ID,如果它在那里,则可能假设它已被先前的安装初始化。