5

我从命令行使用 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 之外使用配置转换预先生成的,这也不能更改,但生成的文件名可以是任何东西。

干杯!

4

2 回答 2

7

你太复杂了。这应该有效:

    <Component Id="setup_a" Guid="some_guid" >
        <File Name="web.config" Id="config_a" Source="$(var.ConfigSourceDir)\setup_a\web.config"  />
        <Condition>ENVIRON = setup_a</Condition>
    </Component>

    <Component Id="setup_b" Guid="some_guid" >
        <File Name="web.config" Id="config_b" Source="$(var.ConfigSourceDir)\setup_b\web.config" />
        <Condition>ENVIRON = setup_b</Condition>
    </Component>

这里要注意几件事:

  • File/@Name 是相同的 - 这是您想要的目标文件名(web.config)
  • 每个文件的 File/@Id 都不同,以避免您首先提到的轻微错误
  • File/@Source 可以是任何东西——它只是描述了要作为源的文件

在此示例中,灯仍会发出警告 LGHT1076,但这只是一个警告 - 请注意,条件必须相互排斥以避免出现问题。

于 2011-12-22T12:04:03.373 回答
2

我通常采取不同的方法。我没有将多个相互排斥的文件放入与特定实例紧密耦合的安装程序中,而是将通用文件放入安装程序中,并使用 XML 更改将 XML 转换为具有变体点数据(例如连接字符串等等)。

这使我可以通过传递一些属性和命令行来制作可以在任何地方静默部署的安装程序。

于 2011-12-23T04:19:04.673 回答