我们一直在迁移到Azure Devops与.Net Core部署到我们的本地Windows服务器上时遇到问题。这可能是由于缺乏对平台的了解,但尽管如此...
问题我们试图弄清楚的是,当遵循“一次构建,到处部署”结构时,我们如何转换我们的web.config文件以将“ASPNETCORE_ENVIRONMENT”env变量设置为正在部署的正确环境。目前我们的应用程序需要设置该变量,因为我们的appsettings分为两个文件,appSettings.json和appSettings.Env.json,其中Env是我们部署到的当前环境(Dev或Prod)。
**例如:**Azure Pipelines构建我们的项目,并且输出工件中的结果web.config将ASPNETCORE_ENVIRONMENT变量设置为“Development”。这很好,因为我们随后将该工件部署到我们的开发环境。但是当我们将其发布到我们的prod阶段时会发生什么?该web.config仍然将ASPNETCORE_ENVIRONMENT变量设置为“Development”。
什么是正确的(2021)转换配置的方法?我甚至不应该在web.config中使用该变量并更改我们与appSettings文件交互的方式吗?
我读过很多关于类似问题的文章和问题,但没有多少与ASPNETCORE_ENVIRONMENT env变量相关。有些人说使用“替换令牌任务”。有些人说使用配置转换(它们不适用于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'
型
2条答案
按热度按时间omjgkv6w1#
当你看到web.config在这里设置
environmentVariable
为this时,如果以另一种方式处理这个问题,你就不需要这个了,比如在你想部署应用程序的地方设置这个。更多信息,你可以找到here in docs - Use multiple environments in ASP.NET Core。但是如果你仍然想通过web.config来做这个,请检查this answer。o4tp2gmn2#
我发现了一种通过发布配置文件来支持设置此值的方法。
在最近的.Net版本中,他们添加了将以下属性添加到发布配置文件的功能。
第一个月
当使用发布配置文件时,生成的web.config中会根据该值设置ASPNETCORE_ENVIRONMENT环境变量。
我在Azure DevOps CI/CD管道中使用这种方法,其中我的构建步骤看起来像这样,其中DEV与Prod的PublishProfile名称不同,这意味着我构建两次,这很好,因为我在prod中以发布模式构建并在dev中进行调试。
字符串
给定bin目录中的默认路径,如我的发布配置文件中所定义的,我的工件发布如下所示:
型
本示例中的Web配置为
型
希望这能帮上忙。干杯