scala 如何在build.sc中创建所有mill目标,如何从目标外部获取目标.dest?

uyhoqukh  于 12个月前  发布在  Scala
关注(0)|答案(1)|浏览(300)

我想写一个mill实用工具(可能是build.sc内部的一个函数或模块),用于总结和后处理各种目标的结果。而不是硬编码所有处理过的目标,我更喜欢一个解决方案,可以以某种方式将build.sc的内容重新排序,并产生一个找到的目标列表,然后我可以从中过滤掉,例如,除了ScalaModule s等。
实现这种迭代器的最优雅的方法是什么?
该实用工具还需要定位每个目标的dest目录。在目标内部,我可以使用T.dest,但如何从“外部”(不运行目标)获取目标目录?
实现这种功能的一种方法是递归浏览./out下的目录结构,但该信息缺少目标类型信息,并且如果目标out目录已清理或尚未运行,则目标out目录也会丢失。因此,无法报告目标Foo存在,但当前没有结果。

e37o9pze

e37o9pze1#

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

$ mill resolve __

字符串
要应用高级过滤,您需要在Scala中进行。Mill已经提供了各种访问模块和目标的支持。只需看看从所有Mill模块继承的类mill.define.Module。举个例子:要访问模块foo的直接子模块,请使用foo.millModuleDirectChildren。您可以在foo.millInternal中找到更多内容,例如modules可以查找所有子模块,或者targets来查找所有目标。
你也可以看看mill.main.MainModule中各种内置命令的实现。在那里你可以找到各种解析器。你甚至可以编写自己的解析器来过滤你想要的任何东西。但是要注意,这远非微不足道。
关于dest目录。一般来说,你甚至不应该访问这个目录。它被认为是目标的实现细节。如果你手头有当前的mill.eval.Evaluator(例如在一个评估器命令中)来检索实际使用的out目录,你可以用mill.eval.EvaluatorPaths.resolveDestPaths获得目标的T.dest的实际路径。
但是你不应该使用这个,你应该只使用目标返回的任何东西。例如,对于compile目标,实际的编译结果不一定位于它的T.dest目录中。另外,注意不要从外部修改dest目录或它的内容,因为这可能会破坏缓存机制。
我指的是最新发布的Mill版本0.10.5。

相关问题