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 deployfab deploy:staging部署到登台环境并fab deploy:production部署到生产环境。

我想弄清楚的是当 env 变量发生变化时如何更新模块中的变量。

我希望我的配置文件尽可能简单,理想情况下,只是变量分配,但如果真的需要,我可以使用一些函数。设置文件中会有很多变量,因此使用 global 关键字更新函数中的值看起来真的很难看。

4

2 回答 2

0

我认为要在config更改时更新模块中的变量,config.env您将需要至少使用一个函数。

最简单的方法可能是env作为变量删除,而是创建一个setEnv函数(将所有其他模块变量设置为适当的值)。另一种选择是保留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']

同样,我不完全确定你打算如何传递你正在寻找的配置,所以如果我错过了标记,请发表评论。在任何情况下,字典都是存储此类信息的 Python 方法,并且可以在需要时轻松导入这些值。

于 2012-09-07T18:51:19.287 回答