【发布时间】:2012-01-26 01:41:04
【问题描述】:
我从命令行使用 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) : error LGHT0091 : Duplicate symbol 'File:web.config' found. 这通常意味着一个 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 之外使用配置转换预先生成的,这也不能更改,但生成的文件名可以是任何东西。
干杯!
【问题讨论】:
标签: wix windows-installer wix3.5 wix3.6