Wix Bundle先决条件验证(Erlang和RabbitMQ)

时间:2017-11-22 05:01:05

标签: wix erlang rabbitmq

这是我的情况。

我需要将 Erlang RabbitMQ 和我的 Msi包的安装文件集成到一个Wix Bundle中。我目前正在使用Bootstrapper项目帮助我做到这一点,而且我仍在努力检查如何检查本地机器中 Erlang RabbitMQ 的可用性。据我所知,有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>

3 个答案:

答案 0 :(得分:0)

你有2个选择。

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

答案 1 :(得分:0)

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

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

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

除了这两件事(EPMD在4369端口和已知目录位置上运行),我担心你不得不要求用户给你答案。

答案 2 :(得分:0)

注册表项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"/>