【问题标题】:Azure Pipelines with .Net Core - Transform web.config for each environmentAzure Pipelines with .Net Core - 为每个环境转换 web.config
【发布时间】:2021-09-19 08:49:34
【问题描述】:

我们在迁移到带有 .Net Core 的 Azure Devops 以部署到我们的本地 Windows 服务器时遇到了问题。这可能是由于缺乏对平台的了解,但尽管如此......

我们试图解决的问题是,当遵循“一次构建,到处部署”结构时,我们如何转换我们的 web.config 文件以将“ASPNETCORE_ENVIRONMENT”环境变量设置为正在部署的正确环境。目前,我们的应用需要该变量集,因为我们的 appsettings 分为两个文件 appSettings.json 和 appSettings.Env.json,其中 Env 是我们正在部署到的当前环境(Dev 或 Prod)。

例如: Azure Pipelines 构建我们的项目,输出工件中生成的 web.config 将 ASPNETCORE_ENVIRONMENT 变量设置为“开发”。这很好,因为我们随后将该工件部署到我们的开发环境中。但是当我们将它发布到我们的产品阶段时会发生什么?该 web.config 仍然将 ASPNETCORE_ENVIRONMENT 变量设置为“开发”。

转换该配置的正确 (2021) 方法是什么?我什至不应该在 web.config 中使用该变量并更改我们与 appSettings 文件交互的方式吗?

我已经阅读了许多关于类似问题的文章和问题,但与 ASPNETCORE_ENVIRONMENT 环境变量相关的内容并不多。有人说使用“替换令牌任务”。有人说使用配置转换(它们不适用于 ASPNETCORE_ENVIRONMENT)。

不知道从这里去哪里。

我最近尝试过的:

Transform web.config for Azure Website Deployment for each release environment

Azure Pipelines Config Transform based on Stage

我在发布时生成的 web.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
  <handlers>
    <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
  </handlers>
  <aspNetCore processPath="dotnet" arguments=".\WebApi.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess">
    <environmentVariables>
      <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
    </environmentVariables>
  </aspNetCore>
</system.webServer>

Azure 管道文件

name: WebApp-$(Date:yyyyMMdd).$(rev:rr)

trigger:
branches:
 include:
 - master

variables:
  major: 2
  minor: 0
  patch: 0
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
  Parameters.WebsiteName: 'webapp'

jobs:
- job: Build  
  pool:
    vmImage: 'windows-latest'

steps:
  - task: DotNetCoreCLI@2
  displayName: 'dotnet restore'
  inputs:
    command: 'restore'
    projects: '$(solution)'

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="webapp" /p:EnvironmentName="Development"'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

- task: VSTest@2
  inputs:
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

- task: ArchiveFiles@2
  displayName: 'Create Zip Archive'
  inputs:
    rootFolderOrFile: '$(build.artifactStagingDirectory)/'
    includeRootFolder: false
    archiveType: zip
    archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildNumber).zip
    replaceExistingArchive: true  

- task: DotNetCoreCLI@2
  inputs:
    command: 'publish'
    publishWebProjects: true

- task: PublishBuildArtifacts@1
  displayName: 'Web Artifact'

【问题讨论】:

  • 我对你的问题感到困惑。 ASP .NET Core 不使用 web.config 进行配置,它使用 appsettings.json。环境变量和 web.config/appsettings.json 是不同的东西。如果要设置环境变量,请让部署管道设置环境变量。如果要转换文件,请遵循转换文件的标准做法。
  • 我的.Net Core WebApi的发布还是会生成一个web.config文件。在生成的 web.config 文件中是 ASPNETCORE_ENVIRONMENT 环境变量,用于设置环境以便访问我在 appsettings.Env.json 中的配置设置。如果没有在 web.config 中设置 ASPNETCORE_ENVIRONMENT 变量,我的应用程序不会加载 appsetting.Env.json 文件。

标签: azure .net-core azure-devops web-config azure-pipelines


【解决方案1】:

当您在此处查看 web.config 时将 environmentVariable 设置为这样,如果以其他方式处理此问题,则不需要此设置,例如您在要部署应用程序的地方设置此设置。更多信息您可以找到here in docs - Use multiple environments in ASP.NET Core。但如果您仍想通过 web.config 执行此操作,请查看this answer。

【讨论】:

  • 我最终在 IIS 的应用程序主机配置中设置了环境变量。因此,我的构建管道不再需要或插入它。
猜你喜欢
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多