.NET 7如何根据发布配置转换appsettings.json?
在ASP.NET 7发布时实现基于EnvironmentName的appsettings.json转换
ASP.NET 7默认不会在发布过程中自动把appsettings.{EnvironmentName}.json的配置合并覆盖到主appsettings.json里,得自己加配置或者脚本实现类似旧版web.config的转换效果,给你几个可行方案:
方案一:通过MSBuild任务自动合并
直接在项目的.csproj文件里添加这段配置,利用MSBuild的XmlPoke任务来覆盖配置节点:
<Target Name="TransformAppSettings" AfterTargets="Publish"> <PropertyGroup> <AppSettingsPath>$(PublishDir)appsettings.json</AppSettingsPath> <EnvAppSettingsPath>$(ProjectDir)appsettings.$(EnvironmentName).json</EnvAppSettingsPath> </PropertyGroup> <XmlPeek XmlInputPath="$(EnvAppSettingsPath)" Query="/*"> <Output TaskParameter="Result" ItemName="EnvSettings" /> </XmlPeek> <XmlPoke XmlInputPath="$(AppSettingsPath)" Query="/*/$(EnvSettings.Identity)" Value="$(EnvSettings.InnerText)" /> </Target>
然后使用你原来的发布命令即可,EnvironmentName参数会自动传递到MSBuild任务中:
dotnet publish /p:Configuration=Release /p:EnvironmentName=Development --output c:\temp -p:SatelliteResourceLanguages=en-US -r win-x64
发布完成后,对应环境的配置会自动覆盖主appsettings.json里的节点。
方案二:用PowerShell脚本手动合并
如果不想修改项目文件,可以写个PowerShell脚本在发布后执行合并操作:
先创建Merge-AppSettings.ps1脚本:
param( [string]$MainConfigPath, [string]$EnvConfigPath ) $mainConfig = Get-Content $MainConfigPath | ConvertFrom-Json $envConfig = Get-Content $EnvConfigPath | ConvertFrom-Json foreach ($prop in $envConfig.PSObject.Properties) { $mainConfig | Add-Member -MemberType NoteProperty -Name $prop.Name -Value $prop.Value -Force } $mainConfig | ConvertTo-Json -Depth 10 | Set-Content $MainConfigPath -Encoding UTF8
然后修改批处理命令,发布完成后直接运行脚本:
dotnet publish /p:Configuration=Release /p:EnvironmentName=Development --output c:\temp -p:SatelliteResourceLanguages=en-US -r win-x64 powershell -ExecutionPolicy Bypass -File .\Merge-AppSettings.ps1 -MainConfigPath "c:\temp\appsettings.json" -EnvConfigPath ".\appsettings.Development.json" pause
方案三:用第三方XDT转换工具
使用dotnet-transform-xdt工具,它支持和旧版web.config一样的XDT转换语法:
- 先安装工具:
dotnet tool install -g dotnet-transform-xdt
- 创建转换文件(比如
appsettings.Development.xdt),用XDT语法定义要修改的节点:
<appSettings xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <add key="ConnectionString" value="DevConnection" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" /> <add key="LogLevel" value="Debug" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" /> </appSettings>
- 发布完成后执行转换命令:
dotnet publish /p:Configuration=Release /p:EnvironmentName=Development --output c:\temp -p:SatelliteResourceLanguages=en-US -r win-x64 dotnet transform-xdt --source "c:\temp\appsettings.json" --transform "appsettings.Development.xdt" pause
内容的提问来源于stack exchange,提问作者Kieran
相关产品推荐
相关产品推荐

