#azure #asp.net-core #.net-core #azure-devops #.net-5
Вопрос:
У меня есть решение для нескольких проектов, в котором 1 родительский проект совместно используется с 3 дочерними проектами.
Каждый дочерний проект имеет свою собственную Program.cs и должен загрузить несколько общих файлов json из моего родительского проекта.
Когда я создаю и публикую свой проект в службе приложений Azure в Linux, все мои файлы перемещаются в «Главная страница/сайт/wwwroot/Свойства», и я могу легко загружать их, как если бы у меня был только один проект:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
//Parent Project Properties
config.AddJsonFile("Properties/appsettings.json", optional: false);
config.AddJsonFile("Properties/ParentProjectConfig.json", optional: false);
//Child Project Properties
config.AddJsonFile("Properties/ChildProjectConfig.json", optional: false);
})
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
Но когда я запускаю свой проект локально, приложение пытается загрузить файлы по их пути в решении:
C:UsersMeMySolutionParentProjectPropertiesParentProjectConfig.json
Поэтому я должен указать, из какого проекта их загружать, как это:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
var sharedProjectPath = Directory.GetParent(env.ContentRootPath).FullName;
config.SetBasePath(sharedProjectPath);
//Parent Project Properties
config.AddJsonFile("ParentProject/Properties/appsettings.json", optional: false);
config.AddJsonFile("ParentProject/Properties/ParentProjectConfig.json", optional: false);
//Child Project Properties
config.AddJsonFile("ChildProject/Properties/ChildProjectConfig.json", optional: false);
})
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
Я мог бы обойти эту проблему, положив огромный жир
if ( /* Running on Azure */ )
{
}
else
{
}
в моей конфигурации конфигурации, но это не кажется очень чистым. У вас есть какие-либо предложения о том, как файлы могут быть загружены с использованием одного и того же кода в обеих средах?
Ответ №1:
На мой взгляд, вы могли бы попробовать использовать Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")
, чтобы проверить, является ли среда производственной или разрабатываемой.
Затем вы можете перекодировать свои коды, чтобы написать логику для использования другого метода конфигурации, чтобы проверить, является ли эта среда производственной или разрабатываемой, если эта среда является производственной, то вы можете использовать первую часть кодов, если эта среда является разработкой, вы можете использовать вторую часть кодов.
Более подробную информацию вы можете получить в приведенных ниже кодах:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
if (environment == "Development")
{
}
if (environment == "Production")
{
}
webBuilder.UseStartup<Startup>();
});
Чтобы задать среду ASPNETCORE_ENVIRONMENT, вы можете обратиться к этой статье.
Результат: