如何通过BUILD CONFIGURATION而非环境变量管理AppSettings?
能否通过BUILD CONFIGURATION实现.NET Core中appsettings.json的配置转换?
可以实现,完全不需要依赖服务器环境变量,沿用你之前使用BUILD CONFIGURATION驱动配置转换的逻辑即可,具体实现方式分两种场景:
方式一:构建时直接替换appsettings.json文件
这种方式简单直接,和你之前替换web.config的逻辑类似,通过构建配置复制对应环境的配置文件覆盖主文件:
1. 创建对应构建配置的appsettings文件
在项目中创建与BUILD CONFIGURATION名称对应的配置文件,比如:
appsettings.Debug.json(对应Debug构建配置)appsettings.Production.json(对应Production构建配置)- 自定义配置(如Test/UAT)则创建
appsettings.Test.json等
2. 修改项目.csproj文件
添加以下配置,确保构建时自动将对应配置的文件复制并覆盖输出目录的appsettings.json:
<ItemGroup> <!-- 主配置文件,默认复制到输出目录 --> <None Update="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <!-- 关联各环境配置文件,设置为依赖主配置文件 --> <None Update="appsettings.Debug.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <DependentUpon>appsettings.json</DependentUpon> </None> <None Update="appsettings.Production.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <DependentUpon>appsettings.json</DependentUpon> </None> <!-- 自定义配置文件依此类推 --> </ItemGroup> <!-- 构建后执行文件替换逻辑 --> <Target Name="ReplaceAppSettings" AfterTargets="Build"> <Copy SourceFiles="appsettings.$(Configuration).json" DestinationFiles="$(OutputPath)appsettings.json" OverwriteReadOnlyFiles="true" Condition="Exists('appsettings.$(Configuration).json')" /> </Target>
3. 简化配置读取代码
不需要再依赖HostingEnvironment.EnvironmentName,直接读取输出目录中已被替换的appsettings.json即可:
static IHostBuilder CreateHostBuilder(string[] args) { var builder = new HostBuilder() .ConfigureAppConfiguration((hostingContext, config) => { // 直接读取构建后生成的最终配置文件 config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); // 如需命令行参数覆盖配置,可保留此行 config.AddCommandLine(args); }) .UseServiceProviderFactory<ServiceRegistry>(new LamarServiceProviderFactory()) .ConfigureServices((hostContext, services) => { var connectionString = hostContext.Configuration.GetConnectionString(JsonSettings.ConnectionStrings.WorkflowComponentDb); services.AddLamar(new ContainerRegistry()); services.AddDbContext<IntegrationDbContext>((provider, options) => { options.UseSqlServer(connectionString); }); services.AddOptions(); }) .UseConsoleLifetime(); return builder; }
方式二:使用配置变换(类似web.config的Transform逻辑)
如果需要仅变换部分配置节点而非替换整个文件,可以用MSBuild的TransformXml任务实现:
1. 创建变换文件
创建以.transform.json为后缀的变换文件,比如appsettings.Production.transform.json,语法与web.config变换一致:
{ "ConnectionStrings": { "WorkflowComponentDb": "Server=ProdDB;Database=Workflow;User Id=xxx;Password=xxx;" }, "Logging": { "LogLevel": { "Default": "Warning" } } }
2. 修改.csproj文件添加变换任务
<!-- 引入TransformXml任务 --> <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" /> <!-- 构建前执行配置变换 --> <Target Name="TransformAppSettings" BeforeTargets="Build"> <TransformXml Source="appsettings.json" Transform="appsettings.$(Configuration).transform.json" Destination="$(OutputPath)appsettings.json" Condition="Exists('appsettings.$(Configuration).transform.json')" /> </Target> <!-- 确保主配置文件复制到输出目录 --> <ItemGroup> <None Update="appsettings.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <None Update="appsettings.*.transform.json"> <DependentUpon>appsettings.json</DependentUpon> </None> </ItemGroup>
最终效果
构建时选择对应的BUILD CONFIGURATION(如Production),MSBuild会自动生成对应环境的appsettings.json,部署到服务器时直接运行即可,完全不需要登录服务器设置环境变量。
内容的提问来源于stack exchange,提问作者Prisoner ZERO
相关产品推荐
相关产品推荐

