我正在使用mill
构建一个管道
- 清理一堆CSV文件(生成新文件)
- 将它们加载到数据库
- 在数据库中做更多的工作(创建视图等)
- 运行查询提取文件。
与步骤2和3相关联的任务是否应该产生类似于PathRef
的东西?如果有,那是什么?它们不会在磁盘上生成文件,但是除非输入发生变化,否则不应该重复这些操作。同样,如果再次运行步骤2中的任务,则应该运行与步骤3关联的任务。
我在目标的文档中看到,您可以返回一个case类,并且重新评估取决于目标返回值的.hashCode
。但是我不知道该怎么处理这些信息。
还有一个相关的问题:mill
是否对每个任务中的代码进行散列?它似乎是做正确的事情,如果我改变一个任务的代码,而不是其他的。
当构建文件(build.sc
或它的依赖/包含)或该任务的输入/依赖改变时,mill中的(缓存)任务被重新运行。无论何时构造PathRef
,都会计算路径内容的校验和并将其用作hashCode。这使得检测更改成为可能,并且仅在发生任何更改时才采取行动。
当然也有例外,例如输入任务(用T.input
或T.sources
创建)和命令(用T.command
创建)总是会运行。
从任务中返回一些东西通常是一个好主意。一个简单的String
或Int
就可以了,例如,用mill show myTask
在shell中显示它,或者稍后对它进行后处理。虽然我认为在外部数据库中运行某些内容的任务应该作为命令或输入任务实现(在运行时可能会检查它是否真的需要做某事),但您也可以将其实现为缓存任务。但是请记住,只有当没有其他进程/用户在其间更改数据库时,状态才会正确。
除了之外,您可以在步骤2中返回当前数据库模式/数据版本或上次更改日期。请确保,每当数据库被修改时,它都会更改。该返回值的每次更改都将触发步骤3和其他相关任务。(当然,第三步需要依赖于第二步。)作为奖励,如果您没有更改数据库,则可以返回相同的(先前/旧)值,这将避免以后在依赖任务中进行任何工作。