前言
一个服务或者产品, 往往需要三个环境: 一个开发环境(Development), 一个测试环境(Staging), 一个生产环境(Production),
这就不可避免的需要多个配置文件来匹配相应的环境, 因为不可能三个环境都使用同一个配置, 生产的数据直接就被污染了.
为了便于管理所有的配置字符串, 把他们集中在一个 JSON 文件, 程序启动时就序列化出来, 有需要更新的时候, 直接修改 JSON 文件即可, 不必修改代码, 以免 regression 或者引入新的 bug.
旧方法
把开发的代码部署到测试环境的时候, 需要手动 merge 到测试环境的 branch, 这个 merge 过程, 需要把修改配置文件;
同理, 在测试环境通过好, 部署到生产环境时, 还要再次手动 merge 一次到 production 的 branch, 之后 VSTS 部署 merge 后的 branch.
这个过程, 繁杂不说, 难免出现配置遗漏, 错配, 或者交接的困难, 毕竟谁都有犯迷糊的时候.
根据环境变量自动读取
.Net Core 的 project, 都有一个 startup.cs 文件, 这个文件是服务启动的时候就会执行的过程, 所以选在这里把需要的依赖注入, 进行初始化:
- public Startup(IHostingEnvironment env)
- {
- var builder = new ConfigurationBuilder()
- .SetBasePath(env.ContentRootPath)
- .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
- .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
- .AddEnvironmentVariables();
- Configuration = builder.Build();
- //Get key vault URL and environment
- var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();
- EnvironmentSettings settings = SettingsProvider.Settings(appSettings.KeyVaultURI, appSettings.Environment);
- ServiceManager.Initialize(settings);
- }
这个构造函数的参数 env, 带有环境变量的值: env.EnvironmentName, 根据这个值的不同, 在项目里添加三个 settings 的 JSON 文件.
每一个 josn 里面的结构必须保持一下, 这样序列化的时候才能正常解析正确的值. 当然, 也要符合 JSON 的语法, 可以使用 JSON 校验工具检查一下.
配置 project 环境变量
.net Core 的项目文件, 在 PackageRoot 下, 都有一个 ServiceManifest.xml 文件, 把一下代码加入进去, 要注意的是环境变量的 Name 必须是: ASPNETCORE_ENVIRONMENT
否则读取失败.
默认是开发环境(Development).
环境变量可以被 override
在 Service fabric 下, 有个 ApplicationManifest.xml
这个文件可以配置对应的参数列表(parameters), 添加一列环境变量:
在这个文件的下方, 在需要根据环境变量读取配置的 project 对应节点内, 添加环境变量的 Name-Value, 这里 [Environment] 的意思是, 读取上图中的 Environment 参数对应的值.
部署时, 选择对应的 xml 文件
在 ApplicationParamerters 文件夹下, 添加对应的参数文件, 每个文件的内容就是对应部署环境的配置文件的名称:
publish 的时候, 选择对应部署环境的 xml 文件即可:
这样, 主要部署的时候, 选对了相应的 xml 文件, 程序启动的时候, startup 就可以正确读取到对应的配置.
后记
这应就减少课很多出错的可能, 项目交接的时候, 也不省了不少交接内容.
参考:
如果觉得有帮助, 就点个推荐吧;
如果写的不好, 欢迎评论指出.
来源: https://www.cnblogs.com/shy-huang/p/10761357.html