我从命令行使用 Wix 3.6 beta,而不是 VS 项目。我有一个以热作为目录的 Web 应用程序。这行得通。我正在使用 web.config 转换来管理每个目标环境 web.config 文件。这些是 msbuild 的输出,它可以工作并在 Visual Studio 和源代码管理中保持可见。
我在部署几个 web.config 文件之一时遇到了问题,我手动将这些文件包含在 product.wxs 中作为具有条件的组件。我期望将所有组件都包含为可部署的功能,并让条件只选择一个作为活动的。例如:
<DirectoryRef Id="wwwroot">
<Component Id="setup_a" Guid="some_guid" >
<File Source="$(var.ConfigSourceDir)\setup_a\web.config" />
<Condition>ENVIRON = setup_a</Condition>
</Component>
<Component Id="setup_b" Guid="some_guid" >
<File Source="$(var.ConfigSourceDir)\setup_b\web.config" />
<Condition>ENVIRON = setup_b</Condition>
</Component>
这没有造成任何文件重命名、移动或删除问题,但有一个非常根本的问题,即多个 web.config 文件映射到同一个目标,这给了我一个轻微的错误“Product.wxs(xxx):错误 LGHT0091 :发现重复符号“文件:web.config”。这通常意味着一个 Id 重复。检查以确保给定类型(文件、组件、功能)的所有标识符都是唯一的。
另一种方法是使用不同的命名 .config 文件并将一个重命名/移动为 web.config,如下所示:
<DirectoryRef Id="wwwroot">
<Component Id="setup_a" Guid="some_guid" >
<File Id="setup_a.config" Source="$(var.ConfigSourceDir)\setup_a.config" />
<CopyFile Id="moveit" SourceDirectory="wwwroot" SourceName="setup_a.config" DestinationDirectory="wwwroot" DestinationName="web.config" />
</Component>
这不会引发错误,bot CopyFile 命令什么都不做。我只是在 wwwroot 文件夹中获取 setup_a.config 。
如果我将 CopyFile 嵌套在文件中,则复制操作将起作用:
<DirectoryRef Id="wwwroot">
<Component Id="setup_a" Guid="some_guid" >
<File Id="setup_a.config" Source="$(var.ConfigSourceDir)\setup_a.config" >
<CopyFile Id="moveit" DestinationName="web.config"/>
</File>
</Component>
...但是嵌套的 CopyFile 意味着我无法添加(不允许) Delete="yes" 属性来创建“移动”操作。相反,我在 wwwroot 文件夹中留下了 setup_a.config 和 web.config。或者,如果我在同一个组件元素中添加一个单独的 removefile,它也不会执行任何操作:
<RemoveFile Id="removefile" On="install" Directory="wwwroot" Name="setup_a.config"/>
</Component>
所以,我希望有一个工作示例,说明如何在条件部署中处理多个 web.config 文件,而不是留下文件。web.config 的目标文件名由框架固定,无法更改。不同的配置也是在 wix 之外使用配置转换预先生成的,这也不能更改,但生成的文件名可以是任何东西。
干杯!