如何阻止 msbuild 在 azure Devops 管道中转换 web.config

Tob*_*bbe 1 c# msbuild azure-devops azure-pipelines

我正在使用 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 conversion does not work on build server说你需要TransformXml在 .csproj 文件中添加一个 emelent 才能使 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)'
Run Code Online (Sandbox Code Playgroud)

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

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

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

/p:TransformWebConfigEnabled=false
/p:AutoParameterizationWebConfigConnectionStrings=false
/p:MarkWebConfigAssistFilesAsExclude=false
/p:ProfileTransformWebConfigEnabled=false
Run Code Online (Sandbox Code Playgroud)

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

Leo*_*SFT 7

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

您可以尝试使用 MSBuild 参数:

/p:IsTransformWebConfigDisabled=true(ASP.NET 核心)

(对于使用 .NET Framework 构建的旧版 ASP.NET 应用程序,请使用/p:TransformWebConfigEnabled=false

作为测试,它在我这边工作得很好:

如果没有/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>
Run Code Online (Sandbox Code Playgroud)

补充一下/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>
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。