簡體   English   中英

我們可以使用單個 appsettings.json 文件,而不是為不同的環境維護多個版本的 appsettings.{environmentname}.json 嗎?

[英]Can we use a single appsettings.json file instead of maintaining multiple versions of appsettings.{environmentname}.json for different environments?

我正在使用 .NET 6,我想實現兩件事:

  1. 使用單個appsettings.json文件而不是為不同的環境維護多個版本的appsettings.{environmentname}.json
  2. appsettings.{environmentname}.json文件中移除硬編碼以允許 (1)而是從 Azure Key Vault 中讀取相同的秘密值,我已經在其中存儲了相同的秘密值)

我怎樣才能實現這些?

下面的代碼片段是我如何維護 2 個appsettings.{environmentname}.json文件(Development & Release)

var builder = WebApplication.CreateBuilder(args);
var hostingEnvironment = builder.Environment;

if (hostingEnvironment.IsDevelopment())
{
    builder.Configuration.SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", false, true) 
    .AddJsonFile($"appsettings.Development.json", false, true) 
    .AddEnvironmentVariables();
}
else
{
    builder.Configuration.SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json", false, true) 
    .AddJsonFile($"appsettings.Release.json", false, true) 
    .AddEnvironmentVariables();
}

注意:我做了一些研究,了解到對於(1)我們可能會做類似的事情:

 builder.Configuration.SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", false, true) 
            .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable(
"ASPNETCORE_ENVIRONMENT")}.json", false, true) 
            .AddEnvironmentVariables();

但是,假設每次利用 CI/CD 時應用程序都會自動部署,我可以在管道中設置AS.NETCORE_ENVIRONMENT的值嗎?

至於, (2) ,我嘗試從 appsettings.{environment}.json 文件中刪除硬編碼的秘密並配置密鑰庫,如下所示,但它不起作用:

builder.Services.Configure<KeyVaultConfig>(options => builder.Configuration.GetSection("KeyVaultConfig").Bind(options));
if (!string.IsNullOrEmpty(builder.Configuration["KeyVaultConfig:KeyVaultUrl"]))
{
  var credentials = new ClientSecretCredential(builtConfig["KeyVaultConfig:TenantID"], builtConfig["KeyVaultConfig:ClientID"], builtConfig["KeyVaultConfig:ClientKey"]);
  var secretClient = new SecretClient(new Uri(builtConfig["KeyVaultConfig:KeyVaultUrl"]), credentials);
  //builder.Configuration.AddAzureKeyVault...
 }

如果最后你打算使用 CI/CD,你只需要 2 個文件(appsettings.json 和 appsettings.Development.json)和默認的 C# 處理這些文件。

在開發中,您對開發所需的所有配置進行硬編碼。 在標准模式中,您放置將在 CI/CD 管道期間替換的密鑰。

例如

在 appsettings.development.json 你有

"ConnectionStrings": {
"myDb": "Server=myDbServer;Database=myDb;User Id=userDev;Password=myPassword;"
}

在 appsettings.json 你有

"ConnectionStrings": {
"myDb": "#{connectionString}#"
}

然后將“#{connectionString}#”替換為 CI/CD 管道配置中的環境值

如果您真的只想擁有一個文件,您可以嘗試使用 Json 變量替換,就像在 CI/CD 管道中記錄的此處記錄的那樣,但第一種方法允許您更輕松地處理保管庫的秘密

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM