ASP.NET Core 中的 Web.config 转换等效于什么?

What is the equivalent of Web.config transform in ASP.NET Core?

ASP.NET 核心文档建议我们应该使用 appsettings.json 文件,以及每个环境的文件,其中包含覆盖值。问题是所有这些文件都已发布,但只有 appsettings.json 和 appsettings.[Environment].json 相关。 另一个问题是要更改服务器上的配置值,必须检查两个文件:基础文件和环境文件。

所以我的问题是:在每个部署环境中拥有一个配置文件的最干净的方法是什么?

主要区别在于 ASP.NET 核心应用程序不像 ASP.NET 应用程序那样针对特定配置进行部署。以前,您实际上是发布为 "Release",例如,如果您想要切换部署配置,则必须重新发布。对于 ASP.NET 核心应用程序,环境由 ASPNETCORE_ENVIRONMENT 环境变量或执行期间传递的环境决定。因此,部署所有可能的环境设置是完全有效的,因为环境可以随心所欲地改变。

就是说,如果您确定自己永远不会更改环境,则可以简单地删除任何不需要的 appsettings.{environment}.json 文件。此外,您不应该真正覆盖 man appsettings.json 中的设置。如果它是特定于环境的,它应该进入特定于环境的 JSON 文件之一。您的主 appsettings.json 文件应该只包含不受环境影响的全局设置。如果您以这种方式处理它,那么您就不必查看两者以了解设置来自何处。

最后,如果您不喜欢这种方法,一般来说,您可以简单地选择不同的配置策略,例如环境变量或外部配置源,例如 Azure Key Vault。

我们可以从查看通常看起来像这样的预定义 ConfigurationBuilder 开始:

var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
    .AddEnvironmentVariables();

Configuration = builder.Build();

如果您一开始就不需要 AddJosnFile(),您可以选择删除它们,因为有时您的项目可能不需要它。

如果您确实打算使用 appsettings.json 或类似的,那么请务必 注意它们的添加顺序。 您可以在上面的代码片段中看到, appsettings.{env}.json 添加 .

之后

这是一个需要理解的重要概念,因为这意味着如果找到与文件名匹配的文件(例如,appsettings.Production.json),它将replace.override任何重叠配置。

注意 替换覆盖重叠.

您可以构建自己的层并以适合您的项目的方式对配置进行分层。 env.EnviornmentName 也不受限制,你可以根据需要使用任何一种条件逻辑来设计它。

如果你打算走这条客制化设计路线。您可能需要注意,在构建 WebHostBuilder 之前(即在调用 .Build() 方法之前),您可以根据需要重新配置和更改配置。因此,您可以非常有创意地以编程方式配置您的项目。