Msbuild web.config转换在生成服务器上不起作用

Msbuild web.config转换在生成服务器上不起作用,msbuild,web-config,teamcity,Msbuild,Web Config,Teamcity,我们正在建立与TeamCity的持续集成,在签入的基础上进行构建。这很好,但是它总是使用默认的web.config构建,而不是使用特定于开发环境的web配置进行转换。 在VisualStudio中,我为开发创建了自定义构建配置。当我选择了development配置在本地发布时,web.development.config会正确转换,但在构建服务器上不会发生这种情况。 在TeamCity中,作为msbuild步骤的一部分,我创建了一个构建参数sys.configuration,并将developm

我们正在建立与TeamCity的持续集成,在签入的基础上进行构建。这很好,但是它总是使用默认的web.config构建,而不是使用特定于开发环境的web配置进行转换。 在VisualStudio中,我为开发创建了自定义构建配置。当我选择了
development
配置在本地发布时,
web.development.config
会正确转换,但在构建服务器上不会发生这种情况。 在TeamCity中,作为msbuild步骤的一部分,我创建了一个构建参数
sys.configuration
,并将
development
作为值传递。但是当它运行时,生成的web.config不会与开发设置一起转换。我还尝试将命令行参数设置为
/p:configuration=development
,但没有成功


任何帮助都将不胜感激。

我认为,要在使用MSBuild而不是Visual Studio发布时进行配置转换,您需要向项目中添加TransformXml任务

提供有关需要添加的内容的指南,但要保存单击,请执行以下操作:



您可能需要更改.targets文件的路径,以符合生成服务器上安装的任何版本。

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

Inside.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>
。。。

然后确保在属性->构建中正确设置了路径

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

  • xmlns:xdt=”http://schemas.microsoft.com/XML-Document-Transform"
  • xdt:Transform=“Replace”
  • 看起来像这样:

    <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执行同样的操作。我们一直在web应用程序项目中使用发布目标,并且已经看到构建过程正确地转换了我们的web.config文件,但是当我们将构建移动到CI服务器时,没有应用转换

    使用的MSBuild脚本为:

    MSBuild.exe路径\u到\u PROJ.csproj/p:DeployOnBuild=true/p:PublishProfile=PUBLISH\u目标

    我们发现,我们仍然需要将配置指定为Debug或Release(即使这似乎是发布目标的一个属性)


    MSBuild.exe路径\u TO_PROJ.csproj/p:DeployOnBuild=true/p:PublishProfile=PUBLISH\u TARGET/p:Configuration=Release

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

    您可以通过以下方式创建MStrong 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

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


    您需要从
    解决方案资源管理器
    → 选择
    活动解决方案配置
    → 更改
    项目上下文下的
    配置

    这对我来说很有效!谢谢你的帮助。我所做的就是卸载我的项目,并将上述代码复制到我的项目文件中。注意:默认情况下,“BeforeBuild”会被注释。此解决方案将更改原始的web.config,因此当您尝试在VS中构建项目时,它会要求您每次都覆盖web.config。在我看来,这是不可接受的。奇怪的是,添加
    /p:Configuration=Release
    是有效的,即使我的发布配置文件也设置为这样!谢谢追加/p:Configuration=MyConfig适合我!谢谢
    "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