我有一个fabfile(fabfile.py),声明了一些任务:
# fabfile.py
from fabric.api import *
@task
def start():
# code
@task
def stop():
# code
然后,当我尝试使用面料中的执行函数调用任何这些任务时,如下所示:
# main.py
from fabric.api import execute
from fabfile import * # I don't really know if this is necessary
# or how should it be done
def main():
execute('start')
它引发了这个错误:
Fatal error: None is not callable or a valid task name
我的目的是为fabfile中指定的某些任务创建一个包装器,可以使用不同的参数调用,并且当你调用这个主程序时必须从参数中获取要执行的任务,所以我不能显式调用该函数,但使用任务名称。
怎么做?也许我误解了面料应该如何运作?
谢谢
将execute('start')
改为execute(start)
。
我没有找到为什么传递一个taskname执行不起作用,但有一个解决方法:
import fabfile
execute(getattr(fabfile, 'start'))
更新:在读取位代码并对结构进行一些测试后,我认为execute('task_name')
只能在加载结构任务时使用。默认情况下,您可以在fabfile.py中使用它,如下所示:
@task
def task1():
#do task1
@task
def task2():
#do task2
@task
def task3():
#do task1 and task2
execute('task1')
execute('task2')
然后你可以使用fab task3
一起执行task1
和task2
。但到目前为止,我仍在使用面料工具。
再次更新:-)
然后我读了一些结构代码,发现使用fabric作为工具将调用fabric.main.main
,它调用fabric.main.load_fabfile
从fabfile加载任务。
由于您使用python main.py
来运行脚本,即使您导入fabfile,也不会加载fab任务。所以我给你添加了一些代码main.py
:
docstring, callables, default = load_fabfile('fabfile.py')
state.commands.update(callables)
而现在,execute('start')
正如你想要的那样工作。
总是不需要使用fabfile.py。我们可以给fabfile任何名字。只有我们需要指定一个参数--fabfile
。
Syntax:
fab --fabfile=<Your File Goes Here> function_name
Example:
fab --fabfile=test test_deploy