Fabric 2+(3.2.2)命令行传递任务参数失败求助
问题原因
你的命令报错是因为Fabric的全局-v/--verbose选项和你任务定义的-v/--value短选项重名了。执行fab set-debug -v true时,系统会把-v识别为全局的verbose模式开关,而非任务的value参数选项,随后把true当成了一个独立的任务名,因此抛出"No idea what 'true' is!"的错误。
解决方法
方法1:使用长选项传递任务参数
直接用任务参数的长选项--value替代短选项-v,避免和全局选项冲突:
fab set-debug --value true
方法2:修改任务参数的短选项
在任务装饰器中显式指定自定义短选项,避开全局的-v:
from invoke import task import os @task( help={"value": "设置调试模式的开启/关闭状态"}, options=[ dict(name="value", short="d", default=False, help="调试模式值(True/False)") ] ) def set_debug(c, value=False): SCRIPTS_DIR = os.path.join(APP_ROOT, "bin") script = os.path.join(SCRIPTS_DIR, "set_debug.sh") c.sudo(f"{script} {str(value).capitalize()}")
修改后即可使用新的短选项传递参数:
fab set-debug -d true
方法3:使用位置参数传递
如果希望直接通过位置传参,在任务装饰器中声明参数为位置参数即可:
from invoke import task import os @task(positional=["value"]) def set_debug(c, value=False): SCRIPTS_DIR = os.path.join(APP_ROOT, "bin") script = os.path.join(SCRIPTS_DIR, "set_debug.sh") c.sudo(f"{script} {str(value).capitalize()}")
此时无需选项标记,直接传递参数值:
fab set-debug true
全局选项的正确用法
使用Fabric全局选项(如-H、-f)时,需将其放在任务名称之前,例如:
fab -H your-server-ip set-debug --value true
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

