多项目解决方案跨环境加载配置文件的路径统一适配问题
方案1:自动路径适配(无环境判断)
利用AddJsonFile的optional参数特性,先尝试加载本地开发路径的配置文件,不存在则自动回退到Azure部署的统一路径,全程无需额外判断运行环境:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { var env = hostingContext.HostingEnvironment; // 尝试本地开发模式的路径加载,不存在则自动跳过 var localBasePath = Directory.GetParent(env.ContentRootPath)?.FullName; if (!string.IsNullOrEmpty(localBasePath)) { config.AddJsonFile(Path.Combine(localBasePath, "ParentProject/Properties/appsettings.json"), optional: true); config.AddJsonFile(Path.Combine(localBasePath, "ParentProject/Properties/ParentProjectConfig.json"), optional: true); config.AddJsonFile(Path.Combine(localBasePath, "ChildProject/Properties/ChildProjectConfig.json"), optional: true); } // 正式环境统一加载路径,必填配置设为optional:false保证缺失时触发异常 config.AddJsonFile("Properties/appsettings.json", optional: false); config.AddJsonFile("Properties/ParentProjectConfig.json", optional: false); config.AddJsonFile("Properties/ChildProjectConfig.json", optional: false); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
方案2:统一本地与部署目录结构(代码零差异)
直接修改子项目的.csproj文件,添加配置将父项目的配置文件在构建时自动复制到本地输出目录的Properties文件夹下,和Azure部署后的目录结构完全对齐,就可以直接用同一套加载代码,不需要任何路径适配:
在每个子项目的csproj文件中加入以下片段:
<ItemGroup> <!-- 复制父项目配置到输出目录的Properties文件夹 --> <Content Include="..\ParentProject\Properties\*.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <Link>Properties\%(Filename)%(Extension)</Link> </Content> <!-- 保留子项目自身配置的复制规则 --> <Content Include="Properties\*.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
配置完成后,本地构建运行时所有配置文件都会统一输出到bin\Debug\net版本号\Properties目录下,和Azure的home/site/wwwroot/Properties结构完全一致,直接用最初的Azure版本加载代码即可,无需任何适配逻辑。
内容的提问来源于stack exchange,提问作者Johste
相关产品推荐
相关产品推荐

