Python doit 中的动态目标名称

Dynamic target names in Python doit

我有一个 Python doit 脚本,其中包含生成文件的任务。文件名根据任务参数而变化。

有没有办法将这些文件包含在 targets 列表中?

不幸的是,任务参数没有填充到目标名称字符串中。

'targets': ['targetfile{version}']

示例任务:

def task_dynamic():
    return {
        'actions': ['touch targetfile{version}'],
        'params': [
            {
                'name': 'version',
                'short': 'v',
                'default': '0'
            }
        ],
        'targets': []
    }

示例命令行:

$ doit dynamic -v 8

有一个 non-ideal 解决方案:我将我的动态输出放在一个具有稳定名称的目录中,然后在我的 targets 列表中引用该目录。

您可以在 actions (just pass the magic parameter task) 或自定义 uptodate 上动态修改任务属性,即

DOIT_CONFIG = {
    'action_string_formatting': 'new',
}

def set_target(task, values):
    version = task.options.get('version', '0')
    task.targets.append(f'targetfile{version}')


def task_dynamic():
    return {
        'actions': ['touch targetfile{version}'],
        'params': [
            {
                'name': 'version',
                'short': 'v',
                'default': '0'
            }
        ],
        'uptodate': [set_target],
    }

有提议的更改可以更轻松地实现这一点,请参阅问题 #311