【问题标题】:Wix Bundle prerequisites validation (Erlang and RabbitMQ)Wix Bundle 先决条件验证(Erlang 和 RabbitMQ)
【发布时间】:2017-11-30 14:33:16
【问题描述】:

这是我的情况。

我需要将 ErlangRabbitMQ 和我的 Msi 包 的安装文件整合到一个 Wix Bundle 中。我目前正在使用一个 Bootstrapper 项目来帮助我做到这一点,但我仍在努力检查如何在我的本地机器中检查 ErlangRabbitMQ 的可用性。据我所知,有3个选项:

使用 RememberProperty 模式进行 RegistrySearch: 这似乎是不可能的,因为在卸载 Erlang 之后,reg 键仍然存在。

使用 CustomAction 通过 cmd 行运行检查。这个不太可能因为Window Installer does not support return value from CustomAction.

执行目录和文件搜索。我们无法假设用户在本地机器上安装文件的位置,所以这个也不太可能。

我错过了什么?我在其他地方做错了吗?你能帮我解决这个问题吗?如何使用 Wix 验证 RabbitMQ 和 Erlang 的存在?

下面是我的代码:

Bundle.wxs

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <?define BundleName = "My Bundle name" ?>
  <?define BundleVersion = "1.0.0.0" ?>
  <?define BundleFullVersion = "1.0.0.0" ?>
  <?define BundleManufacturer = "My Company" ?>
  <?define BundleUpgradeCode = "My Upgrage code" ?>
  <Bundle Name="$(var.BundleName)"
          Version="$(var.BundleVersion)"
          Manufacturer="$(var.BundleManufacturer)"
          UpgradeCode="$(var.BundleUpgradeCode)">
    <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.HyperlinkLicense">
      <bal:WixStandardBootstrapperApplication
        SuppressOptionsUI="yes"
        LicenseUrl=""
        LogoFile=".\resources\images\my_logo.png"/>
    </BootstrapperApplicationRef>
    <Chain>
      <PackageGroupRef Id="ExePackages"/>
      <PackageGroupRef Id="MsiPackages"/>
    </Chain>
  </Bundle>
</Wix>

ExePackages.wxs

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <Fragment>
    <util:RegistrySearch
      Root="HKLM"
      Key="SOFTWARE\Ericsson\Erlang\ErlSrv\1.1\RabbitMQ"
      Format="raw"
      Variable="RabbitMQRegistrySearch"
      Win64="yes"
      Result="exists"/>
    <util:RegistrySearch
      Root="HKLM"
      Key="SOFTWARE\Ericsson\Erlang\ErlSrv\1.1"
      Format="raw"
      Variable="ErlangRegistrySearch"
      Win64="yes"
      Result="exists"/>
    <PackageGroup Id="ExePackages">
      <ExePackage Id="Erlang"
                  DisplayName="Erlang"
                  Compressed="yes"
                  Permanent="yes"
                  Cache="yes"
                  PerMachine="yes"
                  Vital="yes"
                  DetectCondition="ErlangRegistrySearch"
                  SourceFile=".\Prerequisites\otp_win64_20.0.exe"/>
      <ExePackage Id="RabbitMQ"
                  DisplayName="RabbitMQ"
                  Compressed="yes"
                  Permanent="yes"
                  Cache="yes"
                  PerMachine="yes"
                  Vital="yes"
                  DetectCondition="RabbitMQRegistrySearch"
                  SourceFile=".\Prerequisites\rabbitmq-server-3.6.5.exe"/>
    </PackageGroup>
  </Fragment>
</Wix>

【问题讨论】:

    标签: wix erlang rabbitmq


    【解决方案1】:

    注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Ericsson\Erlang\9.0 可能会有所帮助

    试试这个:

    <util:RegistrySearch
          Root="HKLM"
          Key="SOFTWARE\Wow6432Node\Ericsson\Erlang\9.0"
          Format="raw"
          Variable="ErlangRegistrySearch"
          Win64="yes"
          Result="exists"/>
    

    【讨论】:

    • 这正是我所需要的!感谢您的大力帮助,非常感谢! Cảmơn nhé! :)
    • 做 queo câm! :D
    【解决方案2】:

    你有两个选择。

    1. 使用自定义 MBA - 托管引导应用程序。检查this 的起点。很多努力(C# WPF 应用程序)
    2. 使用bafunctions project 来检查服务是否存在\注册表\目录等...(C++ 只是为了添加一些方法)。 该项目是 wix 源代码的一部分。

    【讨论】:

    • 感谢您的回复,能不能说的更具体一些?我正在尝试验证 Erlang 在我的本地机器上的安装,但我在互联网上的任何地方都找不到解决方案。对于您的建议,我很困惑如何使用命令行,并使用它的结果来使程序按我想要的方式工作。非常感谢您提供更多细节。
    【解决方案3】:

    我不太了解 RabbitMQ 如何在 Windows 上安装自身以及它设置了哪些注册表项,但这是问题的另一面——可以通过检查正在运行的 EPMD 或检查它是否侦听来检测 Erlang 当前是否正在运行到它的默认端口 4369。

    由于 EPMD 注册了所有本地运行的 Erlang 节点,因此也可以通过其二进制 TCP 协议联系它并获取节点列表以检查 RabbitMQ 节点是否存在,但这是额外的编码,对于简单的软件检测任务。

    要尝试的另一件事是检查 C:/Program Files...(x86) 中的 1-2 个已知程序位置以及已安装软件的注册表(不确定哪些键,应查阅 RabbitMQ 安装程序源或其他内容)。

    除了这两件事(EPMD 运行在端口 4369 和已知的目录位置)之外,恐怕你还得让用户为你提供答案。

    【讨论】:

    • 对于第二个选项,我可以通过注册表项检查 RabbitMQ,但不能检查 Erlang(因为即使我们卸载了程序,它仍然存在)。感谢您的评论,我正在寻找一个更简单的解决方案,而不是您提供的第一个选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2011-02-02
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    相关资源
    最近更新 更多