私は、Pythonアプリケーションで自動的に設定を設定する方法について考えてきました。gitブランチに基づいてPythonアプリケーションを設定する
は、私は通常のアプローチの次のタイプを使用します。私はこのような作業が好き
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
:通常
'''config.py'''
class Config(object):
MAGIC_NUMBER = 44
DEBUG = True
class Development(Config):
LOG_LEVEL = 'DEBUG'
class Production(Config):
DEBUG = False
REPORT_EMAIL_TO = ["[email protected]", "[email protected]"]
を、私はのような何かを行うことができ、さまざまな方法でアプリケーションを実行しているときしかし、それは意味があるので、私はどうにか私はgitのワークフローにもこれを統合することができますかと思います。
私のアプリケーションの多くは、別々のスクリプト、または単独で実行できるモジュールを持っています。したがって、いくつかのルートの場所から構成を継承するモノリシックなアプリケーションは必ずしもありません。
これらのスクリプトと別々のモジュールの多くは、同じを共有するconfig.py
でクラスを探すことにより、例えば、現在チェックアウトし、それに基づいて自分のデフォルト設定の決定を行うれているもののブランチをチェックすることができればそれはクールになりますnameは現在チェックアウトされているブランチの名前です。
これは可能なのですか、それを達成する最もクリーンな方法は何ですか?
いいですか悪い考えですか?
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):
すべてのブランチで異なるconfig.pyを使用してみませんか?そうすれば、コード内の設定を単純にインポートし、VCS(この場合はgit)に設定ファイル内の相違を処理させることができます。 – spinlok