有没有办法在部署ASP.NET Core应用程序时更改环境设置(比如使用调试/发布版本进行配置文件转换)?
在.NET Core应用程序中维护多个环境设置的最佳方法是什么(类似于<appSettings file="local.config">
用于本地,登台和生产)?
中央配置文件是appsettings.json
,你可以有多个文件,如appsettings.Production.json
等,它们将被加载并覆盖appsettings.json
的设置。
例如
// Set up configuration sources.
var builder = new ConfigurationBuilder()
.SetBasePath(hostEnv.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{hostEnv.EnvironmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
所有你需要的工作是用于设置环境类型的环境变量(参见文档here)。
如果将AddEnvironmentVariables()
添加到配置构建器,则还可以使用覆盖的环境变量。所以如果你有一个appsettings.json
{
"Data" {
"Default" {
"ConnectionString" : "..."
}
}
}
并希望通过环境变量覆盖它,您将设置一个名为“Data:Default:ConnectionString”的环境变量,它的值将覆盖appsettings.config和appsettings.Production.config中的设置(假设您的.AddEnvironmentalVariables()
被调用后) .AddJsonFile()
- 使用匹配键的最后一次注册获胜)使用环境变量中的值。
您可以在官方文档here中找到更多信息。
由于在评论中有些人认为这是设置环境的唯一方法,因此有许多方法可以设置环境变量(大部分都记录在Use multiple environments in ASP.NET Core中),所有这些最终都归结为一个环境变量,只是在不同的范围内:
set ASPNETCORE_ENVIRONMENT=Development
或$Env:ASPNETCORE_ENVIRONMENT = "Development"
,linux上的export ASPNETCORE_ENVIRONMENT = Development
)ASPNETCORE_ENVIRONMENT=Production dotnet MyApp.dll
)web:
environment:
- ASPNETCORE_ENVIRONMENT=Debugging
docker run -e ASPNETCORE_ENVIRONMENT=Debugging
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" forwardWindowsAuthToken="false" stdoutLogEnabled="true" >
<environmentVariables>
<environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" />
</environmentVariables>
</aspNetCore>
)它们都在特定范围内更改/设置环境变量(全局,本地到容器,在应用程序池内,每次执行等)。选择一个适合您需求的产品。
使用额外的dotnet run --launch-profile Development
文件是一个很好的方法。 *片段可用于混合任何区分机器,用户或部署方案的唯一环境属性。
但是,不是使用appsettings.*.json
从头开始构建配置对象(如Web上的许多来源所示),我推荐另一种方法。以下代码不会替换您现有的配置,而是添加到它:
new ConfigurationBuilder()
背景:
当您基于 public IHostingEnvironment _environment { get; }
public IConfiguration _configuration { get; }
public Startup(IConfiguration configuration, IHostingEnvironment environment)
{
_environment = environment;
// use the default config and add config from appsettings.COMPUTERNAME.json (if it exists)
var builder = new ConfigurationBuilder()
.SetBasePath(environment.ContentRootPath)
.AddConfiguration(configuration)
.AddJsonFile($"appsettings.{System.Environment.GetEnvironmentVariable("COMPUTERNAME")}.json", optional: true);
_configuration = builder.Build();
}
模板创建项目时,您的项目已经附带了一个有用的配置,该配置通过dotnet new方法自动构建。此默认配置组合了来自多个源的信息:appsettings.json,appsettings。{Environment} .json,Secret Manager,环境变量和命令行参数。
如果你自己完全重建配置,你将失去所有的魔力。
暗示:
在上面的例子中,CreateDefaultBuilder()只是一个例子。您可以从appsettings.COMPUTERNAME.json
或_environment
中的任何数据撰写自己的json文件名,这些数据可以清楚地区分您的不同开发和部署方案。