我是面料新手,很难让它发挥作用。 当我尝试运行它时,我首先通过 pip3 安装了它,但没有找到命令“fab”,我最终在 /home/me/.local/bin/fab2 中找到了它。
这是正确的地方吗?
第二,每当我这样运行它
/home/me/.local/bin/fab2 version
我明白了
(2, 3, 1)
2.3.1
No idea what 'version' is!
import fabric
if hasattr(fabric, '__version__'):
# For fabric2
print(fabric.__version_info__)
print(fabric.__version__) # for a version tuple
else:
# for fabric1
from fabric.api import *
print(env.version)
/home/me/.local/bin/fab2 是正确的位置吗?
什么是'不知道'版本'是什么!' 为什么会出现?
它正在 fabfile 中寻找一个名为“version”的任务函数,但没有找到。 fab --version
在那里做你想做的事。
$HOME/.local/bin/
是当您pip install --user ...
时 pip 安装可执行“入口点”的位置 - 您可以将$HOME/.local/bin
添加到您的PATH
中(例如在您的~/.bash_profile
或~/.bashrc
)。 如果你做sudo pip install Fabric
(没有--user
)它会将可执行入口点放在/usr/local/bin/
中,这可能已经在你的PATH
中。 或者你可以改用python -m fabric <fab args>
。
嗨,谢谢你的面料——版本很好用
我将脚本更改为如下所示
def hello():
print("Hello world!")
我仍然得到'不知道'你好'是什么!
是否有面料 2 的教程? 我找到了 fabric 1.14 的教程,但目前这并没有真正的帮助,因为没有任何导入工作。 我假设织物 2 以不同的方式处理它。
如果我使用 fab 或 fab2 运行,我会得到同样的错误
我在 /home/me/fabric 有布料
@ajmcateer ,我也遇到了这个问题。 问题是新的结构任务方法(如此处所述 - http://docs.fabfile.org/en/1.14/usage/tasks.html)是使用@task装饰器。 等效的“Hello World”示例是:
from fabric import task
<strong i="8">@task</strong>
def hello(ctx):
print("Hello World")
运行“fab hello”会产生预期的输出。
我有from fabric import task
和@task
装饰器。
我仍然收到“不知道..”错误。
额外细节 :
$ fab --version
Fabric 2.3.1
Paramiko 2.4.1
Invoke 1.1.1
$ python --version
Python 3.6.2
$ more tasks.py
#!/usr/bin/env python
from fabric import task
<strong i="10">@task</strong>
def build(c):
import pdb; pdb.set_trace()
print("Building!")
$ fab build -f tasks.py
No idea what 'build' is!
@mandravaze ,我可以确认它对我有用,虽然我在 fabfile.py 中有任务(它认为这是你的环境中的问题)并且我使用以下行来调用
$fab 建造
它认为这是您环境中的问题
我该如何排除故障? 你想要什么额外的数据?
你在这个位置有什么文件? 我认为 build() 应该在 fabfile.py 中,如果它在那里,也许你的 fab 选择了错误的文件......
@mandarvaze在您的命令fab build -f tasks.py
中有多个混淆。
fab -f tasks.py build
-f
标志用于配置文件,而不是任务集合,这是-c
标志,如fab -c tasks build
(没有“.py”扩展名!)inv
(invoke),如果任务所在的文件是当前目录下的tasks.py,则不需要指定。 对于fab
(fabric),如果任务所在的文件是当前目录下的fabfile.py,则不需要指定。@ploxiln fab -c tasks build
有效。 👍
谢谢。
@ajmcateer ,我也遇到了这个问题。 问题是新的结构任务方法(如此处所述 - http://docs.fabfile.org/en/1.14/usage/tasks.html)是使用@task装饰器。 等效的“Hello World”示例是:
from fabric import task <strong i="9">@task</strong> def hello(ctx): print("Hello World")
运行“fab hello”会产生预期的输出。
抱歉这个愚蠢的问题,但为什么我们需要'ctx' arg? 它是什么?
在结构 2 中,您需要这个ctx
才能在正确的系统上实际运行命令,例如ctx.run("hostname")
如果您的问题是您收到任务参数的此错误,则可能是您没有以正确的格式传递参数,而是您如何命名任务。
fab mytask --task-name value
不是
fab mytask --task_name value
我意识到这不是问题所在,但由于我最终来到这里,我会把它留给有同样问题的其他人。
在结构 2 中,您需要这个
ctx
才能在正确的系统上实际运行命令,例如ctx.run("hostname")
首先谢谢你的信息!!
不幸的是,我不得不说 Fabric 2 是完全钝的。 2.x 的逻辑非常违反直觉,而且关于如何使用它的好基础教程似乎真的不多。 例如,也许我遗漏了一些东西,但是看看 1.x 的逻辑和这个 1.x 教程的质量: https://docs.fabfile.org/en/1.14/tutorial.html。 然后四处寻找 2.x 的等效教程 ....
难怪有一个非官方的 1.x 端口,他们 - 相当大胆 - 称它为 3.x
只是一个一般的 FYI,关于需要@task
装饰器、必须传递上下文对象等的细节_none_出现在 Fabric 的公共文档的“概述和教程”部分: https://docs .fabfile.org/en/1.8/tutorial.html
我是 Fabric 1 的重度用户,并且天真地认为,在我找到这个问题单之前,这个演练正在教我 Fabric 2 的新语义。 它可能真的会阻碍采用,因为这些文档基本上会误导人们入职。
我不确定您是如何进入该页面的,您应该查看https://docs.fabfile.org/en/2.5/getting-started.html
感谢那! 也许它会帮助未来的旅行者在 1 系列文档上添加一个“已弃用”的标题。 我很确定我是从谷歌搜索结果或官方面料网站文档导航到这个的,无论哪种情况,我认为虽然前者不是 Fabric 团队可以控制的东西,但我怀疑许多潜在的采用者正在招致这种挫败感可能会受益于提醒需要查找最新文档(Python 托管的官方文档遵循类似的模式 iirc)。
它可能真的会阻碍采用,因为这些文档基本上会误导人们入职。
Fabric的全新用户。 我用谷歌搜索了“Fabric Python”,然后单击了“概述和教程”链接。 是的,我发现这真的很令人困惑,并且很惊讶我能在这个过程中这么早走错路。
我怀疑许多潜在的采用者正在遭受这种挫败感,并且可能会从提醒需要查找最新文档中受益(Python 托管的官方文档遵循类似的模式 iirc)。
是的。
另外,请注意,这是结果页面:
如果您控制域,则可以配置这些缩进链接。 也许可以从搜索结果中清除 1.x 内容,并在其上添加“已弃用”标题。
我只是偶然发现了这个,终于能够修复它。 面料没有任何问题。
这就是我所做的。
╰─$ fab --version
Fabric 2.5.0
Paramiko 2.7.2
Invoke 1.4.1
在我的fabfile.py
中:
from fabric.tasks import task
<strong i="11">@task</strong>
def test(ctx, title):
print("ctx:", ctx)
print("title:", title)
如果我只是运行任务:
╰─$ fab test
'test' did not receive required positional arguments: 'title'
这意味着它期望title
作为参数。
因此,传递参数:
fab test title="hello world"
输出:
ctx: <your current context. Don't worry about it>
title: title=hello world
但请注意,传递的参数将是一个字符串。 请务必使用=
拆分。
例如:
<strong i="28">@task</strong>
def test(ctx, title):
print("ctx:", ctx)
print("title type:", type(title))
print("title:", title)
print("title value:", title.split("=")[1])
跑:
fab test title="hello world"
输出:
ctx: ...
title type: <class 'str'>
title: title=hello world
title value: hello world
最有用的评论
@ajmcateer ,我也遇到了这个问题。 问题是新的结构任务方法(如此处所述 - http://docs.fabfile.org/en/1.14/usage/tasks.html)是使用@task装饰器。 等效的“Hello World”示例是:
运行“fab hello”会产生预期的输出。