在部署ASP.NET Core应用程序时,是否有一种更改环境设置的方法(例如使用调试/发布构建进行配置文件转换)?
在.NET Core应用程序中维护多个环境设置的最佳方法是什么(类似于<appSettings file="local.config">
用于本地、暂存和生产环境)?
在部署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();
你只需要设置环境类型的环境变量即可使其运行(有关文档请参见此处)。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
或powershell上的$Env:ASPNETCORE_ENVIRONMENT = "Development"
或linux上的export ASPNETCORE_ENVIRONMENT=Development
)。ASPNETCORE_ENVIRONMENT=Production dotnet MyApp.dll
)。Docker容器,例如通过docker-compose.yaml设置。
web:
environment:
- ASPNETCORE_ENVIRONMENT=Debugging
docker run -e ASPNETCORE_ENVIRONMENT=Debugging
通过web.config在IIS中配置。
<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
文件是一个不错的选择。*片段可以用于混合任何唯一的环境属性,以区分机器、用户或部署方案。
但是,我建议采用另一种方法,而不是像网上许多资源中所示的那样,从头开始构建配置对象,使用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 模板创建项目时,你的项目已经自动通过 CreateDefaultBuilder() 方法构建了一个有用的配置。这个默认配置将来自多个来源的信息进行了合并:appsettings.json、appsettings.{Environment}.json、Secret Manager、环境变量和命令行参数。
如果你完全重建配置,那么你将会失去所有这些魔法。
提示:
在上面的示例中,appsettings.COMPUTERNAME.json
仅是一个示例。你可以从 _environment
或 System.Environment
中任何可以清晰区分不同开发和部署场景的数据组成自己的 json 文件名。
setx Hosting:Environment Staging
或在Linux上使用export Hosting__Environment=Staging
(注意双下划线!)。在构建配置时确保有AddEnvironmentVariables()
调用,否则它将无效。 - Tsengdotnet run --launch-profile Development
。这里没有看到任何问题。 - Tseng