【问题标题】:How to iterate all mill targets in build.sc, how to get target.dest from outside the target?如何迭代 build.sc 中的所有轧机目标,如何从目标外部获取 target.dest?
【发布时间】:2022-08-17 00:51:01
【问题描述】:

我想写一个mill 实用工具(可能是build.sc 里面的一个函数或模块),用于汇总和后处理各种目标的结果。与其对所有已处理的目标进行硬编码,我更喜欢一种能够以某种方式迭代build.sc 内容并生成找到的目标列表的解决方案,然后我可以从中过滤掉例如除了ScalaModules 等。

实现这种迭代器最优雅的方法是什么?

该实用工具还需要找到每个目标的dest 目录。在目标内部我可以使用T.dest,但是如何从“外部”(不运行目标)获取目标目录?

完成此类功能的一种方法是递归浏览./out 下的目录结构,但该信息缺少目标类型信息,并且如果目标out 目录已清理或根本未运行,则该目录也将丢失。所以不可能报告目标Foo 存在但目前没有结果。

    标签: scala ammonite mill


    【解决方案1】:

    如果您只对模块和目标列表感兴趣,您可以简单地使用resolve 命令。

    $ mill __.resolve
    

    要应用高级过滤,您需要在 Scala 中进行。 Mill 已经为访问模块和目标提供了各种支持。 看看类mill.define.Module,它继承自所有 Mill 模块。例如:要访问模块foo 的直接子模块,请使用foo.millModuleDirectChildren。您可以在foo.millInternal 中找到更多信息,例如modules 查找所有子模块,或targets 查找所有目标。

    您还可以查看mill.main.MainModule 中各种内置命令的实现。在那里你可以找到各种解析器。您甚至可以编写自己的过滤器来过滤您想要的任何内容。但请注意,这远非微不足道。

    关于dest 目录。通常,您甚至不应该访问此目录。它被认为是目标的实现细节。如果您手头有当前的mill.eval.Evaluator(例如在evaluator command 中)来检索实际使用的out 目录,则可以使用mill.eval.EvaluatorPaths.resolveDestPaths 获取目标的T.dest 使用的实际路径。

    但是,您应该只使用目标返回的任何内容,而不是使用它。没有必要,例如对于compile 目标,实际编译结果位于其T.dest 目录中。另外,请注意不要从外部修改dest 目录或其内容,因为这可能会破坏缓存机制。

    我指的是最新发布的 Mill 版本 0.10.5。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-23
      • 2018-12-08
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多