博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
停止使用非版本控制的可执行代码
阅读量:4323 次
发布时间:2019-06-06

本文共 1680 字,大约阅读时间需要 5 分钟。

开发世界现在有很多反设计模式的开发方式,比如使用可执行代码作为配置文件。

在Python世界里面,你很可能碰到过类似下面的代码:

# 警告:这是反模式代码!try:    from .local_settings import *except ImportError:    pass

一般来说,人们会在local_settings.py文件中加入一些配置变量,然后加入到.gitignore里面。因此,本地开发环境,你的项目需要一个脱离版本控制的可执行代码文件。

如果你觉得不对劲,那么你走在正确的道路上。可执行代码就应该总是处于版本控制中。

另一个更好的方式是,把secrets和key等配置放在环境变量里面。如果你不喜欢这种方式,或者因为环境的原因不可以这么做,仍然可以把配置放在JSON, YAML, TOML文件里面。

local_settings这种反模式

local_settings是反模式,是因为你生产环境的可执行代码,不能被开发者看到,也让他们不好debug解决问题。可能你还没有这种体验,但这确实是最糟糕的调试噩梦之一。

它在我的笔记本上运行良好!

有时候,在开发和测试中没有发现一些细微的bug,发现的时候已经太晚了。

下面是一个真实的例子,来自于去年我帮客户解决的问题:

  1. 项目使用第三方库做slug。配置放在settings中。
  2. 开发者决定自己编写slug项目。在本地运行良好。
  3. 测试没有加入新的testcase,测试那些边角案例。
  4. 在本地开发环境,staging环境,甚至生产环境都看起来运行正常。
  5. 几天之后,一些特定地区的用户报告说,一些记录不可以访问。
  6. 没人知道为什么生产环境会出现这个问题。

然后我介入了。首先我就注意到,settings文件里面有下面这种代码:

# 警告:这是反模式代码!try:    from .local_settings import *except ImportError:    pass

他们在版本控制之外还有可执行代码。这也是为什么在开发环境有效,但是在其它环境有问题。即使这个微妙的bug,已经通过了常规的测试。但是,进入生产环境之后,这个bug就会被用户发现。

然后,最糟糕的是,这个bug在第一时间几乎不可能被发现,因为开发者的local_settings.py的值是正确的。

但是我不会犯这种错误!

人们一般会气愤地说,“我不像你那么蠢,我不会犯这种错误。“

是的,最近20年我也只碰到去年这一次因为这个原因造成的bug。

但是我相信,不管程序员都没天才,多么有经验,都无可避免会犯一些愚蠢的错误。这是为什么一些好的程序员/工程师都会遵循一个很好的习惯 -- 在犯了愚蠢错误的时候,能够快速捕获。如果你认为自己能够完全避免这种错误,我只能说你太年轻了。

回到正题,为什么一定要把配置放在可执行文件里?你可以将它们放在环境变量,或者配置文件。所以,争论结束!

如何处理环境特有变量

使用环境变量,或者配置文件!

你可以使用第三方库。我个人喜欢使用django中自带的功能.

import osfrom django.core.exceptions import ImproperlyConfigureddef get_env_var(var_name):    try:        return os.environ[var_name]    except KeyError:        error_msg = f"Set the {var_name} environment variable"        return ImproperlyConfigured(error_msg)        SECRET_KEY = get_env_var('SECRET_KEY')

转载于:https://www.cnblogs.com/thomaszdxsn/p/stop-using-executable-code-outside-version-control.html

你可能感兴趣的文章
Android 关于悬浮窗权限的问题
查看>>
如何使用mysql
查看>>
linux下wc命令详解
查看>>
敏捷开发中软件测试团队的职责和产出是什么?
查看>>
在mvc3中使用ffmpeg对上传视频进行截图和转换格式
查看>>
python的字符串内建函数
查看>>
Spring - DI
查看>>
微软自己的官网介绍 SSL 参数相关
查看>>
Composite UI Application Block (CAB) 概念和术语
查看>>
64位MATLAB和C混合编程以及联合调试
查看>>
原生js大总结二
查看>>
PHP基础
查看>>
UVa 11488 超级前缀集合(Trie的应用)
查看>>
Django 翻译与 LANGUAGE_CODE
查看>>
[转]iOS教程:SQLite的创建数据库,表,插入查看数据
查看>>
【转载】OmniGraffle (一)从工具栏开始
查看>>
初识ionic
查看>>
java 中打印调用栈
查看>>
开发 笔记
查看>>
数据挖掘算法比赛 - 简单经验总结
查看>>