Skip to main content

Fab文件的构建和使用

本文档包含关于fabfiles的其他章节,如何最好地写它们,以及如何使用它们。

Fab文件发现

Fabric能够加载Python模块(例如 fabfile.py)或软件包(例如,包含 __init__.pyfabfile/ 目录)。默认情况下,它会查找一个名为(对于Python的导入机制) fabfile - 所以 fabfile/fabfile.py

fabfile发现算法在调用用户的当前工作目录或任何父目录中搜索。因此,它围绕“项目”使用定向,其中保持例如。在源代码树的根处的 fabfile.py。这样的fabfile随后将被发现,无论用户在树中的何处调用 fab

要搜索的特定名称可以在具有 -f 选项的命令行上覆盖,或者通过添加设置 fabfile 的值的 织物 行。例如,如果你想命名你的fab文件 fab_tasks.py,你可以创建这样一个文件,然后调用 fab -f fab_tasks.py <task name>,或添加 fabfile = fab_tasks.py~/.fabricrc

如果给定的fabfile名称包含除文件名以外的路径元素(例如 ../fabfile.py/dir1/dir2/custom_fabfile),则它将被视为文件路径,并且直接检查其存在而不进行任何搜索。当在该模式中时,将应用波浪展开,因此可以参考例如。 ~/personal_fabfile.py

注解

Fabric执行您的fabfile的正常 import (实际上是 __import__)以访问其内容 - 它不执行任何 eval 或类似的。为了使这个工作,Fabric临时将找到的fabfile的包含文件夹添加到Python加载路径(然后立即删除它)。

在 0.9.2 版更改: 加载软件包fabfiles的能力。

进口面料

因为Fabric只是Python,你 can 导入其组件任何你想要的方式。然而,为了封装和方便(并使Fabric的包装脚本更容易使用),Fabric的公共API在 fabric.api 模块中维护。

Fabric的所有 操作上下文管理器装饰器具 都作为一个单一的命名空间包含在这个模块中。这使得一个非常简单和一致的界面到你的fabfiles:

from fabric.api import *

# call run(), sudo(), etc etc

这不是技术上最好的做法(对于 a number of reasons),如果你只使用几个Fab API调用,它 is 可能是一个好主意,明确 from fabric.api import env, run 或类似。然而,在大多数非平凡的fabfiles中,你将使用所有或大部分的API,和星级导入:

from fabric.api import *

将会比写入和读取容易得多:

from fabric.api import abort, cd, env, get, hide, hosts, local, prompt, \
    put, require, roles, run, runs_once, settings, show, sudo, warn

所以在这种情况下,我们感到务实,超越最佳实践。

定义任务和导入callables

有关Fabric在加载您的fabfile时将什么作为任务考虑的重要信息,以及有关如何最好地导入其他代码的注释,请参阅 执行模型 文档中的 定义任务