使用doit运行软件管道
spire-pipeline的Python项目详细描述
尖顶
尖顶是围绕doit的薄包装。它通过:
- 基于类的任务声明
- 用于重复性任务的内置工厂
- 当缺少某些依赖项时,可选择修剪任务图
此外,只要任务的操作被修改,任务就会重新运行。
任务声明
spire任务可以是类:这种语法有助于操作列表中的依赖项和目标的重用。
importspireclassBuildHouse(spire.Task):file_dep=["brick","mortar"]targets=["house","dog_house"]actions=[["build"]+file_dep+targets]
然后可以使用通常的doit
命令运行此任务文件:
$ doit run -f build_house.py -d /home/somebody/vacant_lot . BuildHouse
对于简单任务(单个目标或单个操作),不必使用列表。在这种情况下,必须使用成员名的单数形式(即targets变为target,而actions变为action)。
importspireclassBuildShed(spire.Task):file_dep="wood"target="shed"action=["build",file_dep,target]
spire任务在默认情况下是可清除的:使用前面的示例,调用doit clean -f ... -d ...
将删除目标。
重复性任务
对于重复的任务,spire提供了TaskFactory
类。从TaskFactory
派生的类需要为每个对象设置以下成员:
- 任务名,通过
TaskFactory
的构造函数
file_dep
、targets
和actions
importspireclassBuildHouse(spire.TaskFactory):def__init__(self,material):spire.TaskFactory.__init__(self,"Build{}House".format(material))self.file_dep=[material]self.targets=["{}_house".format(material)]self.actions=[["build",material]]houses=[BuildHouse(material)formaterialin["Straw","Sticks","Bricks"]]
修剪任务图
可能会跳过缺少依赖项的任务,而不是执行和失败。为此,必须在file_dep
中将缺少的依赖项指定为None
项,并且必须调用函数spire.prune()
。将从当前任务开始修剪任务图,以确保不会由于这些缺少的目标而发生错误。
在下面的示例中,如果缺少brick
或mortar
,则不会执行BuildHouse
或BuildDogHouse
:
BuildHouse
将被跳过,因为file_dep
包含None
和spire.prune()
被调用的条目BuildDogHouse
将被跳过,因为已跳过其父级之一。
另一方面,如果brick
和mortar
存在但doggie_basket
丢失,则BuildHouse
将成功执行,但BuildDogHouse
将失败,因为其file_dep
不等于None
。
importosimportspireclassBuildHouse(spire.Task):file_dep=[xifos.path.isfile(x)elseNoneforxin["brick","mortar"]]target="house"action=["build"]+file_dep+[target]classBuildDogHouse(spire.Task):file_dep=[BuildHouse.target,"doggie_basket"]target="dog_house"action=["build"]+file_dep+[target]spire.prune()
任务图的图形表示
可以通过调用spire
模块来生成Graphviz格式的任务图的图形表示:
$ python3 -m spire graph tasks.py tasks.dot
通过传递选项--tasks-only
,可以通过py生成一个简化的表示,省略目标和依赖节点。任何其他选项都将直接传递给doit,例如指定命令行变量。