在Wix中执行XmlTransform,而不是在编译时执行

本文关键字:执行 编译 Wix XmlTransform | 更新日期: 2023-09-27 18:20:38

我有一个解决方案,其中我有不同的app.config,给定不同的配置。缺点是为特定配置创建了安装程序(使用Wix创建)。我想在安装时这样做,这样我就可以用命令行参数启动安装程序来进行xml转换,从而能够在不同的环境中使用相同的安装程序(开发、测试、验收)。

因此,目前我在csproj文件中有一个转换:

<Target Name="AfterBuild"> <TransformXml Source="App.config" Transform="App.$(Configuration).config" Destination="$(OutputPath)'$(AssemblyName).exe.config" /> </Target>

我想做的是:

msiexec /i installer.msi PROD

使得应用程序中的转换。执行PROD.config。Wix有没有办法通过转换来实现这一点?

在Wix中执行XmlTransform,而不是在编译时执行

与其在安装时转换原始文件,不如将所有转换后的app.config文件包括在MSI包中,然后在安装时通过传递属性值来选择合适的文件。

wxs文件的片段可能如下所示:

<Component Id="AppConfigDev" Guid="...">
  <Condition>MODE = "DEV"</Condition>
  <File Name="app.config" Id="app.dev.config" KeyPath="yes" Source="$(var.Source)'app.DEV.config" />
</Component>
<Component Id="AppConfigTest" Guid="...">
  <Condition>MODE = "TEST"</Condition>
  <File Name="app.config" Id="app.test.config" KeyPath="yes" Source="$(var.Source)'app.TEST.config" />
</Component>
<Component Id="AppConfigProd" Guid="...">
  <Condition>MODE = "PROD"</Condition>
  <File Name="app.config" Id="app.prod.config" KeyPath="yes" Source="$(var.Source)'app.PROD.config" />
</Component>

因此,当您通过命令行传入MODE的值时,将只安装上面的一个组件,并且它最终将作为app.config出现在目标目录中。

请注意,Windows安装程序将抛出一个警告,指出这些条件必须相互排斥才能使此技术发挥作用。只要MODE属性一次只能有一个值,这些条件在定义上是互斥的,但警告是存在的。