如何在 ASP.NET 8 里支持多个 appsettings 配置

如何在 ASP.NET 8 里支持多个 appsettings 配置

1. 介绍

在很多时候,我们都需要将 .NET Core 项目发布到不同的环境中,这就有可能要为不同的环境使用不同的配置,如会产生以下的配置文件:

appsettings.dev.json
appsettings.uat.json
appsettings.demo.json
appsettings.prod.json

默认情况下,.Net 程序只会读取 appsettings.json 里的配置,那么我们要如何做才能使用不同的配置文件呢? 还有要如何只发布相应环境下的配置文件到发布文件夹里呢?

2. 我要做到的效果

有很多相关的教程介绍了如何使用 ASPNETCORE_ENVIRONMENT 变量来处理多种发布环境的配置,这种做法的话,当你在发布项目时就需要定义或者更新 ASPNETCORE_ENVIRONMENT 变量,但我想要做到的是想直接通过命令行方式发布项目,然后自动生成不同环境的配置文件到相应的发布文件夹里,不需要我在手动复制或者选择其他文件了。

这样做的好处是可以一次性设置好不同的命令,然后就可进行无脑发布操作了;而其另一个好处就是,每次发布项目时只需直接将相应文件夹里文件上传到相对应的服务器即可,不需再次考虑现在服务器上的配置文件版本或者弄错配置文件。

3. 使用多环境下的配置文件

要使用多配置文件,我们需要在 Program.cs 里动态加载指定的配置文件,如下:

builder.Configuration.AddJsonFile('appsettings.dev.json', optional: true, reloadOnChange: true);

然后我们可以使用预编译条件去决定要加载哪个配置文件

#if DEV
builder.Configuration.AddJsonFile('appsettings.dev.json', optional: true, reloadOnChange: true);
#elif DEMO
builder.Configuration.AddJsonFile('appsettings.demo.json', optional: true, reloadOnChange: true);
#elif UAT
builder.Configuration.AddJsonFile('appsettings.uat.json', optional: true, reloadOnChange: true);
#elif PROD
builder.Configuration.AddJsonFile('appsettings.prod.json', optional: true, reloadOnChange: true);
#endif

但请等等,为了要使用这些预编译条件,我们就需要先在项目文件 *.csproj 里定义好先

  <PropertyGroup Condition=" '(Configuration)' == 'demo'">
    <DefineConstants>DEMO</DefineConstants>
  </PropertyGroup>

  <PropertyGroup Condition=" '(Configuration)' == 'dev'">
    <DefineConstants>DEV</DefineConstants>
  </PropertyGroup>

  <PropertyGroup Condition=" '(Configuration)' == 'uat'">
    <DefineConstants>UAT</DefineConstants>
  </PropertyGroup>

  <PropertyGroup Condition=" '(Configuration)' == 'prod'">
    <DefineConstants>PROD</DefineConstants>
  </PropertyGroup>

我们可以根据所需要的环境变量去自定义这些条件,$(Configuration) 变量就是由命令行传递进来的参数(我稍后将会说明)

在这个例子中,我添加了多个配置文件,但最终生成时,我只需要其中一个发布到相应的文件夹中,这时就可以在项目文件 *.csproj 中使用以下配置为不同环境只保留其相应的配置文件

  <ItemGroup Condition=" '(Configuration)' == 'dev'">
    <Content Remove="appsettings.demo.json" />
    <Content Remove="appsettings.uat.json" />
    <Content Remove="appsettings.prod.json" />
  </ItemGroup>
  <ItemGroup Condition=" '(Configuration)' == 'demo'">
    <Content Remove="appsettings.dev.json" />
    <Content Remove="appsettings.uat.json" />
    <Content Remove="appsettings.prod.json" />
  </ItemGroup>
  <ItemGroup Condition=" '(Configuration)' == 'uat'">
    <Content Remove="appsettings.demo.json" />
    <Content Remove="appsettings.dev.json" />
    <Content Remove="appsettings.prod.json" />
  </ItemGroup>
  <ItemGroup Condition=" '(Configuration)' == 'prod'">
    <Content Remove="appsettings.demo.json" />
    <Content Remove="appsettings.dev.json" />
    <Content Remove="appsettings.uat.json" />
  </ItemGroup>

通过以上配置,就会移除不需要的文件,因此当发布相应环境项目时,就会只将相应配置文件发布到对应文件夹了

最后,我们可使用以下命令根据不同环境进行项目发布

dotnet publish -c demo -r win-x64 -p:PublishReadyToRun=true 

这里的重点是 -c 参数,其指定了你要发布的环境,即之前我们在 csproj 里配置的那些环境变量和条件,而这个参数值就会被直接传递到 $(Configuration) 变量中

如以上的命令执行完后,将会在发布文件夹里只保留了以下2个配置文件

appsettings.json
appsettings.demo.json

4. 总结

一般情况下,当我们要在不同环境下使用不同的配置,我们也可以直接在 appsettings.json 文件里添加配置项然后在代码中进行处理,如添加一个配置变量 evn:uat,但这样做的话,每当我们发布项目后,就需要去修改 appsettings.json 文件里的相关配置,同时也要在代码做做相应的处理,万一发布后忘记修改,将可能带来不必要的麻烦。所以我建议可直接通过命令行发布项目的同时,就指定使用不同环境的配置文件,这样也有得于减低对发布出错的风险,同时代码层面也不需做过多处理,最后只需直接无脑发布相关文件到服务器上即可。

代码部落

免费订阅以得到最新文章发布的通知

请放心,这个绝对不会是垃圾邮件
而且您随时也可以取消的

版权声明:
作者:winson
链接:https://www.coderblog.cc/2024/09/how-to-setup-multiple-appsettings-in-asp-net-8/
来源:代码部落中文站
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录