具有非文件产品的铣削任务是否应该产生类似于 PathRef 的东西?

Should mill tasks with non-file products produce something analogous to PathRef?

我正在使用 mill 构建一个管道

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

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

我在 documentation for targets 中看到您可以 return 一个案例 class 并且重新评估取决于目标 return 的 .hashCode价值。但我不确定如何处理这些信息。

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

当该任务的构建文件(build.sc 或它的 dependencies/includes)或 inputs/dependencies 更改时,mill 中的(缓存)任务被重新 运行。每当你构造一个 PathRef 时,都会计算路径内容的校验和并用作 hashCode。这使得检测变化成为可能,并且仅在发生任何变化时才采取行动。

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

从任务中 return 通常是个好主意。一个简单的 StringInt 就可以了,例如用 mill show myTask 或 post 在 shell 中显示 - 稍后处理。虽然我认为 运行ning 外部数据库中的某项任务应该作为命令或输入任务来实现(当 运行ning 时,它可能会检查它是否真的需要做某事),你也可以将其实现为缓存任务。但请记住,只有在没有其他 process/user 在其间更改数据库的情况下,状态才会正确。

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