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

时间:2015-11-04 09:45:01

标签: c# wix

我有一个解决方案,我有不同的app.configs,给定不同的配置。缺点是为特定配置创建了一个安装程序(使用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

这样就可以执行app.PROD.config中的转换。在Wix中有没有办法使用转换实现这一目标?

1 个答案:

答案 0 :(得分:0)

不是在安装时转换原始文件,而是将所有已转换的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 Installer会发出警告,说明条件必须互斥才能使此技术正常工作。只要MODE属性一次只能有一个值,这些条件根据定义是互斥的,但警告就在那里。