SBT 使用子模块测试类路径排序

问题描述 投票:0回答:1

我在 sbt 中有两个模块:

top
common
top
取决于
common
,并且
common
src/main/resources/application.conf
中有一些配置,这些配置在
src/test/resources/application.conf
中被覆盖。

当我在 intellij 中从

top
运行测试时,一切正常。但是使用 sbt 运行不起作用,因为来自 common 的
main
test
之前出现在类路径上。

基本上,对于顶级模块(

top
),它做了正确的事情,将测试类放在类之前,但对于依赖项,顺序是相反的:

top/target/test-classes,top/target/classes,common/target/classes,common/target/test-classes

这似乎是一个错误,但我最感兴趣的是某种可以用来快速解锁的解决方法,最好不更改实际代码(例如,我知道我可以重命名测试中的文件,然后让 Config 读取)首先,但这似乎......令人讨厌:/)。有什么想法吗?

我实际上发现这篇文章似乎正在谈论我的问题并提供了解决方案,但是当我尝试将

Test / dependencyClasspath ~= { println("FOO"); cp => cp.sortBy(f => f.data.getName ) }
添加到build.sbt时(我知道这不是正确的顺序,但仍然应该做一些事情) ),没有任何区别(并且不打印任何内容)。

scala sbt multi-project
1个回答
0
投票
好吧,实际上看起来 github 问题中建议的解决方案确实有效,我只需要将每个项目的调用包装到

.settings

 中:

def fixClasspath(cp: Seq[Attributed[File]]): Seq[Attributed[File]] = cp .groupBy { case x => if (x.data.getName == "test-classes") 1 else if (x.data.getName == "classes") 2 else 3 } .toSeq .sortBy(_._1) .flatMap(_._2) lazy val top = (project in file("top")) .dependsOn("common" % "test -> test; compile -> compile") .settings(Test / dependencyClasspath ~= fixClasspath)
    
© www.soinside.com 2019 - 2024. All rights reserved.