web.config转换在构建服务器

时间:2016-02-15 09:19:15

标签: msbuild web-config teamcity

我们正在与团队城市建立持续集成,并在签到时进行构建。这工作正常,但它始终使用默认的web.config构建,它不会使用特定于开发环境的Web配置进行转换。 在Visual Studio中,我为开发创建了自定义构建配置。当我选择“开发”配置进行本地发布时,'web.development.config'会正确转换。但这不会发生在构建服务器上。 在团队城市,作为msbuild步骤的一部分,我创建了一个构建参数'sys.configuration',我将'development'作为值传递。但是当它运行时,生成的web.config不会使用开发设置进行转换。我也尝试将命令行参数设置为'/ p:configuration = development',但没有成功。

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:13)

我们一直在我们的Web应用程序项目中使用发布目标,并且已经看到构建过程正在转换我们的web.config文件,但是当我们将构建移动到CI服务器时,没有应用转换。 / p>

MSBuild脚本使用的是:

MSBuild.exe PATH_TO_PROJ.csproj /p:DeployOnBuild=true /p:PublishProfile=PUBLISH_TARGET

我们发现我们仍然需要将配置指定为调试或发布(即使这似乎是发布目标的属性。)

MSBuild.exe PATH_TO_PROJ.csproj /p:DeployOnBuild=true /p:PublishProfile=PUBLISH_TARGET /p:Configuration=Release

答案 1 :(得分:7)

我相信,使用MSBuild而不是Visual Studio发布时会发生配置转换,您需要在项目中添加TransformXml任务。

This answer提供了您需要添加的内容的指南,但是要保存点击次数:

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
<Target Name="BeforeBuild">
    <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" />
</Target>

您可能需要将.targets文件的路径更改为与构建服务器上安装的任何版本一致。

答案 2 :(得分:3)

为了正确生成转换,需要满足多个条件

在.csproj中,请确保您拥有以下所有内容:

<Project> ...

      <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
      <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />
      <Target Name="SetTransformAppConfigDestination" BeforeTargets="PrepareForBuild" Condition="exists('Web.$(Configuration).config')">
        <PropertyGroup>
          <!-- Force build process to use the transformed configuration file from now on. -->
          <AppConfig>$(IntermediateOutputPath)$(TargetFileName).config</AppConfig>
        </PropertyGroup>
        <Message Text="AppConfig transformation destination: = $(AppConfig)" />
      </Target>
      <Target Name="TransformAppConfig" AfterTargets="PrepareForBuild" Condition="exists('Web.$(Configuration).config')">
        <TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="$(AppConfig)" />
      </Target>
    </Project>

同时更新.csproj文件中的项目组。

<ItemGroup> ...

<Content Include="Web.config">
      <SubType>Designer</SubType>
    </Content>
    <Content Include="Web.Debug.config">
      <DependentUpon>Web.config</DependentUpon>
    </Content>
    <Content Include="Web.Release.config">
      <DependentUpon>Web.config</DependentUpon>
      <IsTransformFile>True</IsTransformFile>
    </Content>
    <Content Include="Views\Web.config" />
    <Content Include="Views\Home\Index.cshtml" />
  </ItemGroup>

这将导致您的配置文件嵌套在资源管理器视图中

enter image description here

然后确保在属性中正确设置路径 - &gt;建立

enter image description here

然后添加到要转换的每个节点的web.release.config标记

  1. xmlns:xdt =“http://schemas.microsoft.com/XML-Document-Transform”
  2. XDT:变换= “替换”
  3. 看起来像这样:

    <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> 
       <appSettings xdt:Transform="Replace"> 
           <add key="VariableToBeTransformed" value="ValueToInsert"/> 
       </appSettings> 
       <system.web>
           <compilation xdt:Transform="RemoveAttributes(debug)" /> 
       </system.web>
    </configuration> 
    

    希望这对每个人都有帮助,你可以为app.config做同样的事情

答案 3 :(得分:0)

如果您使用的是Visual Studio 2019(在此示例中为社区版),则最新的msbuild.exe的路径如下所示: “ C:\ Program Files(x86)\ Microsoft Visual Studio \ 2019 \ Community \ MSBuild \ Current \ Bin \ MSBuild.exe”

,您可以通过以下方式创建msstrong textbuild脚本:

"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe" MyProject.csproj /p:DeployOnBuild=true /p:PublishProfile=Release /p:VisualStudioVersion=16.0 

其中的参数 DeployOnBuild 在构建后会触发多个目标,其中有一个目标可以转换web.config。 "The DeployOnBuild=true property essentially means "I want to execute an additional target when build completes successfully."

答案 4 :(得分:0)

Publish中的Visual studio函数在您的项目中使用PublishProfiles/foo.pubxml来确定您的配置,而MSBuildproject.sln中来确定您的配置。

您需要从Configuration Manager打开Solution Explorer→选择Active solution configuration→更改Configuration下的Project contexts