这是我的情况。
我需要将 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>
答案 0 :(得分:0)
你有2个选择。
答案 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"/>