【发布时间】:2016-03-09 15:01:01
【问题描述】:
我正在使用 WiX 为 Windows 服务构建合并模块。 合并模块的工作不仅是安装文件,而且还进行一些配置如果用户在设置期间选择了此选项(带有一些表单字段和复选框的单独对话框)。其余的设置是使用 InstallShield 构建的。
为此,我有两个组件。第一个基本上只是写一个注册表项。另一个配置并启动服务,它的键路径是一个(不同的)注册表键。
就像一个魅力,直到我测试运行安装程序两次。弹出 InstallShield 维护对话框,我可以选择修改安装。我的期望是我可以通过更改是否满足相反条件的组件来在我的两个组件之间切换($(var.ValidConfiguration) 在 WiX 文件中的某处定义,整个内容都有括号):
没有配置的组件:
<Component Id="ServiceConfigurationDisabled" Guid="(some guid)" Transitive="yes">
<Condition><![CDATA[NOT $(var.ValidConfiguration)]]></Condition>
<ServiceControl
Id="DontStartService" Name="MyService"
Stop="both" Remove="both" Wait="no" />
<!-- Registry entry without value, is key path -->
<RegistryValue
Root="HKLM" Key="SOFTWARE\Company\MyService)"
Name="AutoconfigDisabled" Value=""
Type="string" KeyPath="yes" />
</Component>
带有配置的组件:
<Component Id="ServiceConfigurationEnabled" Guid="(different guid)" Transitive="yes">
<Condition><![CDATA[$(var.ValidConfiguration)]]></Condition>
<ServiceControl
Id="StartService" Name="MyService"
Start="install" Stop="both" Remove="both" Wait="no" />
<!-- Other registry entry, this time storing some information, is key path -->
<RegistryValue
Root="HKLM" Key="SOFTWARE\Company\MyService"
Name="AutoconfigEnabled" Value="some value"
Type="string" KeyPath="yes" />
<!-- Other registry values, settings, ... -->
<RegistryValue (...) />
<util:XmlFile (...) />
<firewall:FirewallException (...) />
</Component>
第一次,我让条件评估为假。
日志文件在InstallValidate 期间有这些条目:
ServiceConfigurationDisabled.(guid); Installed: Absent; Request: Local; Action: Local
ServiceConfigurationEnabled.(guid); Installed: Absent; Request: Local; Action: Null
完美。
不执行第二个组件的任何操作,只创建 AutoconfigDisabled 注册表项。
再次调用设置,这一次条件评估为真:
ServiceConfigurationDisabled.(guid); Installed: Local; Request: Null; Action: Null
ServiceConfigurationEnabled.(guid); Installed: Local; Request: Null; Action: Null
等等,什么?
即使在第一轮中没有安装第二个组件(这就是Action: Null 的意思?),它现在注册为Installed: Local。没有执行第二个组件的任何操作,注册表没有变化。
我做错了什么?
【问题讨论】:
标签: wix windows-installer installshield