如何让Waf运行自定义Task类?执行代码遇命令未找到错误
如何让Waf运行自定义Task类
你遇到的错误是因为bld(rule="move_files")会让Waf把move_files当成shell命令去执行,而系统中并没有这个命令,所以报错。要运行自定义的Task类,不能用rule参数,需要通过Waf的任务创建API来实现。
正确实现方式
基础版(直接创建任务实例)
from waflib.Task import Task import os class move_files(Task): def run(self): # 这里可以替换成你需要执行的逻辑 os.system("cp foo bar") def build(bld): # 创建自定义Task类的实例并添加到构建流程 bld.create_task('move_files')
优化版(添加输入输出依赖)
为了让Waf能正确跟踪文件变化(仅当输入文件更新时才执行任务),建议指定任务的输入和输出:
from waflib.Task import Task from waflib import Utils class move_files(Task): def run(self): # 使用Waf内置的跨平台文件复制工具,比os.system更可靠 Utils.copy_file(self.inputs[0].abspath(), self.outputs[0].abspath()) def build(bld): tsk = bld.create_task('move_files') # 指定输入文件(必须存在) tsk.inputs = bld.path.find_resource('foo') # 指定输出文件(会自动创建父目录) tsk.outputs = bld.path.find_or_declare('bar')
关键说明
- 自定义Task类继承自
waflib.Task.Task后,Waf会自动将类名注册为任务类型,直接用create_task即可创建实例。 - 不要用
rule参数调用自定义Task类,rule仅适用于shell命令或简单Python函数。 - 添加输入输出后,Waf会自动处理依赖关系,避免不必要的重复构建。
内容的提问来源于stack exchange,提问作者Thundercleez
相关产品推荐
相关产品推荐

