首页 > 解决方案 > 如何阻止 msbuild 在 azure devops 管道中转换 web.config

问题描述

我正在使用一个 ASP.NET MVC 应用程序,我们已经开始将它升级到 azure devops(代码和管道)。我们有多个 web.config 文件,每个环境(测试、发布等)一个。之前,我们已经构建了本地发布系统并将 zip 导入 IIS。在本地发布(右键单击,发布)期间,Visual Studio 获取与当前构建配置(在我们的示例中为发布)相关的 Web.*.config 文件,并将其与基本 Web.config 合并到单个 Web.config 文件中。

使用管道时,我们的目标不是在构建步骤中转换 Web.config 文件,而是在发布步骤中。我们想要构建 1 个包,并在我们的测试、登台和生产服务器上使用相同的包,而不是使用发布管道中的xml 转换设置来将不同的 web.config 文件传递​​到不同的环境。如果从测试到发布一直测试相同的二进制文件,我们会对我们的过程更有信心。

但是,每当我使用“构建解决方案”步骤时,它总是会转换 Web.config 文件,无论我使用哪种设置。

到目前为止我所做的:我查看了 MS 文档,但没有发现任何相关内容。我搜索了 SO 并找到了一些线程,例如这个:web.config transformation does not work on build server说你需要TransformXml在你的 .csproj 文件中添加一个元素才能使 XML 转换工作,但我们没有一,所以我不能删除它,看看是否有帮助:) 大多数线程似乎建议将不同的标志传递给 msbuild 以阻止它转换 xml 文件(如下所列),但似乎没有一个有效。我找到了一种解决方法,它不适用于我们的项目设置方式。我已经按照这个 github 问题删除了<DependentUpon>相关 Web.*.config 文件的标签。不幸的是,没有任何帮助。

这是构建步骤的 YAML:

steps:
- task: VSBuild@1
  displayName: 'Build solution'
  inputs:
    solution: '**\Source\[redacted]Solution\*.sln'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\\" /p:PreBuildEvent="" /p:TransformWebConfigEnabled=false /p:AutoParameterizationWebConfigConnectionStrings=false /p:MarkWebConfigAssistFilesAsExclude=false /p:ProfileTransformWebConfigEnabled=false'
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'

这些是之前在项目中设置的构建标志:

/p:DeployOnBuild=true
/p:WebPublishMethod=Package
/p:PackageAsSingleFile=true
/p:SkipInvalidConfigurations=true
/p:PackageLocation="$(build.artifactstagingdirectory)\\"
/p:PreBuildEvent=""

这些是我尝试在构建管道中尝试禁用 Web.Config 转换的标志,但似乎都不起作用(尝试了不同的组合):

/p:TransformWebConfigEnabled=false
/p:AutoParameterizationWebConfigConnectionStrings=false
/p:MarkWebConfigAssistFilesAsExclude=false
/p:ProfileTransformWebConfigEnabled=false

那么,我需要将哪些标志传递给 Azure Pipelines 中的 msbuild 以使其转换 Web.*.config 文件?

标签: c#msbuildazure-devopsazure-pipelines

解决方案


我需要将哪些标志传递给 Azure Pipelines 中的 msbuild 以使其不转换 Web.*.config 文件?

您可以尝试使用 MSBuild 参数:

/p:IsTransformWebConfigDisabled=true.

作为测试,它在我这边运行良好:

没有/p:IsTransformWebConfigDisabled=true,我的测试web.config将转换为:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\WebAppTransform.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" hostingModel="InProcess"></aspNetCore>
  </system.webServer>
</configuration>

添加/p:IsTransformWebConfigDisabled=true,测试web.config不会被转换:

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false">
    </aspNetCore>
  </system.webServer>
</configuration>

希望这可以帮助。


推荐阅读