如何在Wix Bundle安装程序中为RabbitMQ设置环境变量
如何在Wix Bundle中为RabbitMQ设置环境变量RABBITMQ_NODE_PORT?
我有一个Wix Bundle安装程序,用于安装两个自研MSI包和两个第三方程序(Erlang、RabbitMQ)。需要为第三方RabbitMQ设置环境变量RABBITMQ_NODE_PORT,但不想通过自研MSI来实现——因为自研程序依赖RabbitMQ运行,若先安装自研MSI再设置变量,自研服务会因RabbitMQ未安装而启动失败。
当前Bundle代码
<?xml version="1.0" encoding="UTF-8"?> <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" xmlns:bal="http://schemas.microsoft.com/wix/BalExtension"> <Bundle Name="Foo" Version="1.0.0.0" Manufacturer="Bar" UpgradeCode="3a1fef0b-d0b3-4cbe-a1a8-b1d1c00079e7"> <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.HyperlinkLicense"> <bal:WixStandardBootstrapperApplication LicenseUrl=""/> </BootstrapperApplicationRef> <Variable Name="RBMQPORT" bal:Overridable="yes"/> <Chain> <PackageGroupRef Id="Dotnet"/> <PackageGroupRef Id="RabbitMQ"/> <MsiPackage Id="FirstAPI" SourceFile="../firstinstaller.msi"> <MsiProperty Name="RBMQPORT" Value="[RBMQPORT]"/> </MsiPackage> <MsiPackage Id="SecondAPI" SourceFile="../secondinstaller.msi"> <MsiProperty Name="RBMQPORT" Value="[RBMQPORT]"/> </MsiPackage> </Chain> </Bundle> <Fragment> <PackageGroup Id="Dotnet"> <ExePackage Id="AspNetCoreRuntime" DisplayName="ASP.NET Core Runtime 8.0.4" Compressed="yes" Cache="yes" PerMachine="yes" Permanent="yes" Protocol="netfx4" Vital="yes" SourceFile=".\prerequisites\dotnet-hosting-8.0.4-win.exe" InstallCommand="/passive /norestart /silent" /> <ExePackage Id="DotnetDesktopRuntime" DisplayName=".NET Desktop Runtime 8.0.4" Compressed="yes" Cache="yes" PerMachine="yes" Permanent="yes" Protocol="netfx4" Vital="yes" SourceFile=".\prerequisites\windowsdesktop-runtime-8.0.4-win-x64.exe" InstallCommand="/passive /norestart /silent" /> </PackageGroup> <PackageGroup Id="RabbitMQ"> <ExePackage Id="ErlangFramework" DisplayName="Erlang Framework 26.2.5" Compressed="yes" Cache="yes" PerMachine="yes" Permanent="yes" Protocol="netfx4" Vital="yes" SourceFile=".\prerequisites\otp_win64_26.2.5.exe" InstallCommand="/passive /norestart /silent" /> <ExePackage Id="RabbitMQServer" DisplayName="RabbitMQ Server 3.13.6" Compressed="yes" Cache="yes" PerMachine="yes" Permanent="yes" Protocol="netfx4" Vital="yes" SourceFile=".\prerequisites\rabbitmq-server-3.13.6.exe" InstallCommand="/passive /norestart /silent" /> </PackageGroup> </Fragment> </Wix>
尝试过的无效方法
试过使用Wix的<Environment>元素设置变量,但该元素必须嵌套在<Component>中且需指定目录,当前场景不需要也没有对应目录:
<Component Id="foo"> <Environment Id="bar" Name="RABBITMQ_NODE_PORT" Value="5673" Permanent="yes" Action="set"/> </Component>
可行解决方案
方案1:安装RabbitMQ前通过cmd设置永久系统环境变量
在RabbitMQ的PackageGroup中添加一个调用setx命令的ExePackage,在Erlang和RabbitMQ安装前设置系统级环境变量:
<PackageGroup Id="RabbitMQ"> <!-- 设置RABBITMQ_NODE_PORT系统环境变量 --> <ExePackage Id="SetRabbitMQPortEnv" DisplayName="Set RabbitMQ Node Port Environment Variable" Compressed="yes" Cache="no" PerMachine="yes" Permanent="yes" Vital="yes" SourceFile="cmd.exe" InstallCommand="/c setx RABBITMQ_NODE_PORT [RBMQPORT] /M" /> <ExePackage Id="ErlangFramework" DisplayName="Erlang Framework 26.2.5" Compressed="yes" Cache="yes" PerMachine="yes" Permanent="yes" Protocol="netfx4" Vital="yes" SourceFile=".\prerequisites\otp_win64_26.2.5.exe" InstallCommand="/passive /norestart /silent" /> <ExePackage Id="RabbitMQServer" DisplayName="RabbitMQ Server 3.13.6" Compressed="yes" Cache="yes" PerMachine="yes" Permanent="yes" Protocol="netfx4" Vital="yes" SourceFile=".\prerequisites\rabbitmq-server-3.13.6.exe" InstallCommand="/passive /norestart /silent" /> </PackageGroup>
- 说明:
setx /M用于设置系统级环境变量,需要管理员权限,Bundle的PerMachine="yes"会自动触发UAC提升;该变量会在后续启动的RabbitMQ安装进程中生效,无需重启系统。
方案2:临时设置环境变量后启动RabbitMQ安装
修改RabbitMQ的安装配置,通过cmd先临时设置环境变量,再启动安装程序,无需永久保留环境变量:
<PackageGroup Id="RabbitMQ"> <ExePackage Id="ErlangFramework" DisplayName="Erlang Framework 26.2.5" Compressed="yes" Cache="yes" PerMachine="yes" Permanent="yes" Protocol="netfx4" Vital="yes" SourceFile=".\prerequisites\otp_win64_26.2.5.exe" InstallCommand="/passive /norestart /silent" /> <ExePackage Id="RabbitMQServer" DisplayName="RabbitMQ Server 3.13.6" Compressed="yes" Cache="yes" PerMachine="yes" Permanent="yes" Protocol="netfx4" Vital="yes" SourceFile="cmd.exe" InstallCommand="/c SET RABBITMQ_NODE_PORT=[RBMQPORT] && ".\prerequisites\rabbitmq-server-3.13.6.exe" /passive /norestart /silent" /> </PackageGroup>
- 说明:将
SourceFile改为cmd.exe,在InstallCommand中先临时设置环境变量,再调用RabbitMQ安装程序;该变量仅在当前安装进程中生效,不会修改系统全局环境变量。
额外注意
- 建议给
RBMQPORT变量设置默认值:<Variable Name="RBMQPORT" bal:Overridable="yes" Value="5673" /> - 确保Bundle以管理员权限运行,否则无法设置系统级环境变量。
内容的提问来源于stack exchange,提问作者Starsek
相关产品推荐
相关产品推荐

