0

Fabric ファイルの構成を保持するモジュールを作成しようとしています。この構成ファイルにはプロジェクトに依存する設定が保持されるため、すべてのプロジェクトで同じ fabfile を使用できます。

fabfile を次のようにします。

import config
from fabric.api import local

def deploy(env='staging'):
    config.env = env
    local("xcopy {project_dir} {deploy_target} /u /r /y".format(project_dir=config.project_dir, 
                                                                deploy_target=config.deploy_target))
    #Ok, this will be more involved than that, but it is enough to explain my problem

構成ファイルは次のようになります。

env = 'staging'
project_dir = r'c:\some\unimportant\path'
deploy_target = r'c:\some\target\path\based\on\{env}'.format(env=env)

fab deployまたはを使用 fab deploy:stagingして、ステージング環境に展開し、運用環境fab deploy:productionに展開できます。

私が理解しようとしているのは、env 変数が変更されたときにモジュール内の変数を更新する方法です。

構成ファイルをできるだけシンプルにしたいのですが、理想的には変数の割り当てだけですが、本当に必要な場合はいくつかの機能を使用できます。設定ファイルには多くの変数があるため、global キーワードを使用して関数内の値を更新すると、非常に見苦しくなります。

4

2 に答える 2

0

configを変更するたびにモジュール内の変数が更新されるようconfig.envにするには、少なくとも 1 つの関数を使用する必要があると思います。

最も簡単な方法は、変数としてドロップenvし、代わりにsetEnv関数を作成することです (他のすべてのモジュール変数を適切な値に設定します)。もう 1 つのオプションは、そのままにしておくenvことですが、関数を呼び出して他の値を取得することです (例: config.get_deploy_target())。

envモジュールに値のみが含まれているように見せることもできますが、実際にはそれらの一部またはすべてがまたは他の値に基づいてオンザフライで計算されます。これには、実際のモジュールではなくクラス インスタンスから実際に値を読み取るように、Python モジュール ルックアップ システムでいくつかのトリックを行う必要があります。configこれにより、モジュールを使用するコードを単純にすることができますが、config.pyそれ自体がはるかに複雑になります。

# config.py

class Config(object):
    def __init__(self):
        self.env = "staging"
        self.project_dir = r'c:\some\unimportant\path'

    @property
    def deploy_target(self):
        return r'c:\some\target\path\based\on\{env}'.format(env=self.env)

import sys
sys.modules["config"] = Config()
于 2012-09-07T19:55:58.353 に答える
0

設定パラメータをディクショナリに保存します。

したがって、ファイルのあるディレクトリには、次のような名前の__init__.pyファイルがありますmy_config.py(注、これは python_path にある必要があります)。

my_params = {'env': 'staging',
             'project_dir': r'c:\some\unimportant\path',
             'deploy_target': r'c:\some\target\path\based\on\staging',
            }

構成設定を fabfile に渡す方法はわかりませんが、構成ファイルに辞書があれば、設定へのアクセスは非常に簡単です。単一の辞書で定義された単一のプロジェクトのすべての構成設定がある場合 (上記のように)、以下を fabfile に入れることができます。

config = __import__('my_config')

その時点で、次の方法で構成設定にアクセスできます。

env = config.my_params['env']

繰り返しますが、探している構成をどのように渡すつもりなのか完全にはわかりません。マークを逃した場合はコメントしてください。いずれにせよ、辞書はこのような情報を格納する Pythonic の方法であり、必要に応じてこれらの値を簡単にインポートできます。

于 2012-09-07T18:51:19.287 に答える