【发布时间】: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