一个灵活的代码配置思路
一个灵活的代码
配置思路
本篇阅读时间约为 4 分钟。
1
前言
本篇文章分享给那些正在码程序的同胞们!若看懂本篇文章需要有些编程基础才能看懂笔者所写,非战斗人员尽快撤离!~
今天在看 Python 的 Flask 框架(一个敏捷的 web 框架)时,学习到了一个非常有用并且灵活的思想,不知道是不是现在各大互联网公司都是通过此思路实现灵活配置的,反正笔者之前所在的公司不是通过此种方法进行灵活配置的....所以分享记录下,看懂的可以留言讨论下,看不懂的呢...看个乐子吧!
2
业务场景
做 Web 后台的同学们都知道,各家公司在正式上线代码之前都有着不同的环境,比如开发环境、测试环境、验证环境、生产环境等等....对于不同的环境来说,涉及到的配置文件就很头疼,不同环境所对应的配置文件内容也会不一致,生产环境的有生产配置文件对应地址,测试环境的有测试配置文件所对应的地址。
而笔者之前开发时,大家采用的是对同一个配置文件名称里进行修改,比如有个叫 readme.properties 的文件,其中有 url 参数,开发环境的
url = http://127.0.0.1/hello ,
而生产环境则要对应的地址
url = http://10.10.23.1/hello。
这样一来写好两个,开发分支,注释掉生产环境的地址,上生产时,则打开生产的 url ,注释掉测试环境的。
以上场景,会遇到一个问题,人都有犯错不仔细的时候,万一忘了注释修改相应的配置,打包上传升级后,就会影响到生产环境,造成一些不必要的损失。
3
灵活配置的思路
有种思路可以很轻松地解决这种问题,就是不要将所有环境都写在同一个配置文件里,尽可能的把配置文件按照环境不同进行拆分。虽然可能项目中的配置文件会很多,但是百分之百的正确总比多配置文件要稳。
例如下图的一个项目小例子,同一个项目所依赖的文件,分为三种环境,一个是默认用到的配置文件,一个是本地开发用到的配置文件,还有一个是生产上用到的配置文件:
对于这三者配置文件是有个命名规范的,下划线前面是环境的英文名称,而后面则是 setting 。分开之后,要思考的关键是,在引入配置文件处,如何使用代码对其进行一个灵活的控制?
重点思路:设置系统自身的环境变量来控制项目中的环境!
4
代码实现
以 Python 代码为例,看下如何灵活的配置,思路是通用的,不论是什么语言,终归是能实现的!
代码如下:
# 读取 config 目录下的 base_setting 文件
self.config.from_pyfile('config/base_setting.py')
# 获取系统环境变量,如果包含了 ops_config ,则读取 ops_config 对应的值
if 'ops_config' in os.environ:
self.config.from_pyfile(f'config/{os.environ["ops_config"]}_setting.py')
此处是读取 Python 配置文件时的地方,默认加载 base_setting.py 配置文件,如果当前系统环境变量包含 ops_config 字段,将之读取到,读取当前系统环境变量配置的值,覆盖原有配置文件。
这么解释代码可能不是很明白,继续来看下,此处环境变量是指的什么?
f'config/{os.environ["ops_config"]}_setting.py'
中的os.environ["ops_config"]获取的就是上面图片红框标注的值。
在 linux 下,对环境变量设置一个
ops_config=local
这样通过代码中读取到的文件则是 local.setting.py 文件了。
通过此方法,比如在测试环境,则只需要在对应的 linux 机器上设置
ops_config=test
代码中覆盖掉默认的 base.setting,加载的则会是 test.setting 配置文件。
5
心得
学习到了这个思想的笔者,反正是恍然大悟,原来环境变量还可以这么玩...使用上述思路达到的效果就是项目各环境分开明确,不会引起混乱,升级的时候只需要全升级即可。
编程语言不是问题,主要还是思想呐!
至此完!
长按关注
公众号名称:咪哥杂谈
一个咪咪怪的公众号
长按二维码关注哦!