C# 如何阻止msbuild在azure devops管道中转换web.config

C# 如何阻止msbuild在azure devops管道中转换web.config,c#,msbuild,azure-devops,azure-pipelines,C#,Msbuild,Azure Devops,Azure Pipelines,我正在使用一个ASP.NET MVC应用程序,我们已经开始将其升级到azure devops(代码和管道)。我们有多个web.config文件,每个环境(测试、发布等)一个。之前,我们构建了本地发布的系统,并将zip导入IIS。在本地发布(右键单击,release)期间,Visual studio获取与当前生成配置(在本例中为release)相关的Web.*.config文件,并将其与基本Web.config合并到单个Web.config文件中 使用管道时,我们的目标不是在构建步骤中转换Web.

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

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

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

到目前为止我所做的:我查看了MS文档,但没有发现任何相关内容。我搜索了这么多,找到了一些线索,例如:这条线索说你需要一个
TransformXml
emelent在你的.csproj文件中才能进行XML转换,但我们没有,因此,我无法删除它,看看这是否有帮助:)大多数线程似乎建议向msbuild传递不同的标志,以阻止它转换xml文件(如下所示),但似乎没有一个有效。我发现了一个与我们的项目设置方式不符的问题。我已经删除了相关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转换时使用的标志,但似乎都不起作用(尝试了不同的组合):

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

我需要向Azure管道中的msbuild传递哪些标志才能使其不转换Web.*.config文件

您可以尝试使用MSBuild参数:

/p:IsTransferormWebConfigDisabled=true

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

如果没有
/p:IsTransformMWebConfigDisabled=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>
希望这有帮助

我需要向Azure管道中的msbuild传递哪些标志才能使其不转换Web.*.config文件

您可以尝试使用MSBuild参数:

/p:IsTransferormWebConfigDisabled=true

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

如果没有
/p:IsTransformMWebConfigDisabled=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>

希望这能有所帮助。

@Tobbe,任何时候,如果它对您有效,请随时告诉我。嗨,很抱歉没有回复!我已经病了好几天没上班了:)是的,它似乎工作得很好!我很好奇,你是怎么找到那面旗子的?我已经仔细查看了msbuild标志,但没有找到一个很好的参考。@Tobbe,听到这个消息我很难过。照顾好你的身体!我曾经是MSBuild技术支持,我觉得我在博客中看到了这个参数,然后对它进行了测试。@Tobbe,找到了@Tobbe我需要向Azure管道中的MSBuild传递哪些标志才能使其转换Web.*.config文件?@Tobbe,随时通知我它是否免费为您工作。您好,很抱歉没有响应!我已经病了好几天没上班了:)是的,它似乎工作得很好!我很好奇,你是怎么找到那面旗子的?我已经仔细查看了msbuild标志,但没有找到一个很好的参考。@Tobbe,听到这个消息我很难过。照顾好你的身体!我曾经是MSBuild技术支持,我觉得我在博客中看到了这个参数,然后对它进行了测试。@Tobbe,找到了@我需要向Azure管道中的MSBuild传递哪些标志才能使其转换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>