基于git branch配置Python应用程序

时间:2012-05-01 17:01:31

标签: python git configuration

我一直在考虑在Python应用程序中自动设置配置的方法。

我通常使用以下类型的方法:

'''config.py'''
class Config(object):
    MAGIC_NUMBER = 44
    DEBUG = True

class Development(Config):
    LOG_LEVEL = 'DEBUG'

class Production(Config):
    DEBUG = False
    REPORT_EMAIL_TO = ["ceo@example.com", "chief_ass_kicker@example.com"]

通常,当我以不同的方式运行应用程序时,我可以执行以下操作:

from config import Development, Production

do_something():
    if self.conf.DEBUG:
       pass

def __init__(self, config='Development'):
    if config == "production":
        self.conf = Production
    else:
        self.conf = Development

我喜欢这样工作因为它有意义,但是我想知道我是否能以某种方式将它集成到我的git工作流程中。

我的很多应用程序都有单独的脚本或可以单独运行的模块,因此从一些根位置继承配置并不总是单一的应用程序。

如果很多这些脚本和单独的模块可以检查当前检出的分支并根据它做出默认的配置决策,例如通过在{中查找一个类,那将是很酷的{1}}与当前签出的分支的名称共享同一名称。

这是可能的,实现它的最简洁方法是什么?

这是好主意吗?

1 个答案:

答案 0 :(得分:1)

我更喜欢spinlok的方法,但是,你可以在__init__中做任何你想要的事情,例如:

import inspect, subprocess, sys

def __init__(self, config='via_git'):
    if config == 'via_git':
        gitsays = subprocess.check_output(['git', 'symbolic-ref', 'HEAD'])
        cbranch = gitsays.rstrip('\n').replace('refs/heads/', '', 1)
        # now you know which branch you're on...
        tbranch = cbranch.title() # foo -> Foo, for class name conventions
        classes = dict(inspect.getmembers(sys.modules[__name__], inspect.isclass)
        if tbranch in classes:
            print 'automatically using', tbranch
            self.conf = classes[tbranch]
        else:
            print 'on branch', cbranch, 'so falling back to Production'
            self.conf = Production
    elif config == 'production':
        self.conf = Production
    else:
        self.conf = Development

这是,嗯,“经过轻微测试”(python 2.7)。请注意,如果git无法获得符号引用,check_output将引发异常,这也取决于您的工作目录。您当然可以使用其他subprocess函数(例如提供不同的cwd)。