0

mill用来建立一个管道

  1. 清理一堆 CSV 文件(生成新文件)
  2. 将它们加载到数据库中
  3. 在数据库中做更多的工作(创建视图等)
  4. 运行查询以提取一些文件。

与步骤 2 和 3 相关的任务是否应该产生类似的东西PathRef?如果是这样,是什么?它们不会在磁盘上生成文件,但除非输入更改,否则不应重复。同样,如果步骤 2 中的任务再次运行,与步骤 3 关联的任务也应该运行。

我在目标文档中看到您可以返回一个案例类,并且重新评估取决于.hashCode目标的返回值。但我不确定如何处理这些信息。

还有一个相关的问题:是否mill对每个任务中的代码进行哈希处理?如果我为一项任务而不是其他任务更改代码,这似乎是在做正确的事情。

4

1 回答 1

1

build.sc当构建文件(或其依赖项/包含)或该任务的输入/依赖项发生更改时,mill 中的(缓存的)任务将重新运行。每当您构造 aPathRef时,都会计算路径内容的校验和并将其用作 hashCode。这使得检测更改成为可能,并且仅在发生任何更改时才采取行动。

当然也有例外,例如输入任务(使用T.inputor创建T.sources)和命令(使用 创建T.command)将始终运行。

一般来说,从任务中返回一些东西是个好主意。一个简单的StringInt将做的,例如在外壳中显示它mill show myTask或稍后对其进行后处理。虽然我认为在外部数据库中运行某些东西的任务应该实现为命令或输入任务(运行时可能会检查它是否真的需要做某事),但您也可以将其实现为缓存任务。但请记住,只有在没有其他进程/用户在两者之间更改数据库时,状态才会正确。

除此之外,您可以在步骤 2 中返回当前数据库架构/数据版本或最后更改日期。确保在修改数据库时它会更改。该返回值的每次更改都会触发第 3 步和其他相关任务。(当然,第 3 步需要依赖于第 2 步。)作为奖励,如果您没有更改数据库,您可以返回相同的(以前/旧的)值,这样可以避免以后在相关任务中的任何工作。

于 2021-03-02T22:45:43.553 回答