使用Wix如何在安装ASP.net Web应用程序时部署多个web.config文件之一

时间:2011-12-22 11:48:41

标签: wix windows-installer wix3.5 wix3.6

我从命令行使用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:找到重复的符号'File:web.config'。这通常意味着Id是重复的。检查以确保给定类型(文件,组件,功能)的所有标识符都是唯一的。“< / em>的

另一种方法是使用不同的命名.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>

这不会引发错误,但是CopyFile命令根本不执行任何操作。我只是在wwwroot文件夹中获取setup_a.config。

如果我将CopyFile嵌套在File中,则复制操作将起作用:

        <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之外预先生成不同的配置,这也无法更改,但生成的文件名可以是任何内容。

喝彩!

2 个答案:

答案 0 :(得分: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>

请注意以下几点:

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

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

答案 1 :(得分:2)

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

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