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

Pau*_*rge 5 windows-installer wix 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>
Run Code Online (Sandbox Code Playgroud)

这没有创建任何文件重命名,移动或删除问题,但有一个非常基本的问题,即多个web.config文件被映射到同一目的地,这给我一个轻微的错误"Product.wxs(xxx):error LGHT0091 :找到重复的符号'File: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>
Run Code Online (Sandbox Code Playgroud)

这不会引发错误,但是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>
Run Code Online (Sandbox Code Playgroud)

...但嵌套的CopyFile意味着我无法添加(不允许)Delete ="yes"属性来创建"移动"操作.相反,我留下了wwwroot文件夹中的setup_a.config和web.config.或者,如果我在同一个组件元素中添加一个单独的removefile,它也什么都不做:

<RemoveFile Id="removefile" On="install" Directory="wwwroot" Name="setup_a.config"/>
</Component>
Run Code Online (Sandbox Code Playgroud)

所以,我希望有一个工作示例,说明如何处理条件部署中的多个web.config文件,这些文件不会留下文件.web.config的目标文件名由框架修复,无法更改.使用配置转换也可以在wix之外预先生成不同的配置,这也无法更改,但生成的文件名可以是任何内容.

干杯!

Yan*_*nko 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>
Run Code Online (Sandbox Code Playgroud)

请注意以下几点:

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

在这个样本中,灯仍会抱怨LGHT1076,但这只是一个警告 - 它引起你的注意,条件必须互相排斥,以避免出现问题.