【问题标题】:Switch between components during installation and maintenance在安装和维护期间在组件之间切换
【发布时间】: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


    【解决方案1】:

    在维护操作期间通常不会重新评估组件条件,因此它们不利于用户可能更改的内容。您可以通过在每个组件上设置 transitive attribute 来获得所需的行为,这会要求重新评估条件。但我怀疑您必须将组件分解为单独的合并模块,以便它们可以放置在使用项目中的单独功能上,然后专门为首次安装和维护选择这些功能。

    【讨论】:

    • 传递属性已经设置,但没有任何区别。我已经考虑过使用两个合并模块使其成为一个功能,但不幸的是我们的构建系统目前不允许这样做。
    • 你真的应该使用功能。这正是它们的用途 - 从维护模式更改已安装的文件/组件。
    • 我接受这个答案。虽然在这种特殊情况下它对我没有帮助,但它似乎是正确的做法。
    • 附加信息:我完全从设置中删除了维护模式。在修复模式下,整个事情接缝工作得更好。
    猜你喜欢
    • 1970-01-01
    • 2021-07-31
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多