Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala sbt子项目聚合和依赖行为_Scala_Sbt - Fatal编程技术网

Scala sbt子项目聚合和依赖行为

Scala sbt子项目聚合和依赖行为,scala,sbt,Scala,Sbt,我有一个sbt项目,其中有几个子项目,每个子项目都发布一些工件,并且有一个相当广泛的测试套件 在CI服务器上运行构建时,我希望将构件发布到一个暂存位置,并在发布任务之后运行测试。由于其他人可能需要这些工件,我想告诉sbt,我希望它为所有子项目构建所有工件,然后运行所有测试,因为默认情况下,它似乎以未指定的顺序交错运行它们 我有一个ScopeFilter允许我访问所有子项目,因此我可以使我的ciBuild任务依赖于以下内容 (test in Test).all(subprojectScopeFil

我有一个sbt项目,其中有几个子项目,每个子项目都发布一些工件,并且有一个相当广泛的测试套件

在CI服务器上运行构建时,我希望将构件发布到一个暂存位置,并在发布任务之后运行测试。由于其他人可能需要这些工件,我想告诉sbt,我希望它为所有子项目构建所有工件,然后运行所有测试,因为默认情况下,它似乎以未指定的顺序交错运行它们

我有一个
ScopeFilter
允许我访问所有子项目,因此我可以使我的
ciBuild
任务依赖于以下内容

(test in Test).all(subprojectScopeFilter).dependsOn(myArtifactsTask.all(subprojectScopeFilter))`

然而,这似乎对顺序没有任何实际影响,我肯定看到一些子项目在其他子项目运行其
myArtifactsTask
之前运行测试。我猜我不完全理解
所有的
是如何工作的,可能是说每个独立子项目的
测试任务取决于同一个子项目的
myArtifactsTask
?如果是这样的话,我如何指定我想要什么?有没有记录下我错过的地方?本手册介绍了
所有
的基础知识,但没有介绍它如何与其他构造交互。

SBT将自动解析任务和项目之间的顺序,并按该顺序构建它们

你能做的是——假设你有三个项目。根项目和两个子项目。我假设键
myArtifactTask
是在根目录中定义的

project/Build.scala
myArtifactTask
在两个子项目中都实现

子项目-a/build.sbt
子项目-a/build.sbt
您要做的是定义root的
build.sbt
,在两个项目中都调用myArtifactTask。然后您可以定义新任务
testedArtifact
,这将取决于
myArtifactTask

build.sbt
lazy val testedArtifact=taskKey[Unit](“运行myArtifactTask,然后执行测试”)
inAnyProjectButRoot中的lazy val:ScopeFilter=ScopeFilter(
项目内——项目内(本项目)
)
myArtifactTask:={
myArtifactTask.all(inAnyProjectButRoot).value
}
testedArtifact:={
(测试中的测试).all(anyProjectButRoot).值
}

testedArtifact是您的
myArtifactsTask
调用
程序集
?您是否已通过例如在汇编中测试禁用了它:={}
?@lpiepiora您能详细说明一下这将做什么吗?我没有禁用它,但我不太明白它将如何改变事情。对不起,我太快下结论了。我认为您的一些任务可能已经调用了测试,而SBT只对任务键求值一次。然而,我认为SBT会抱怨循环依赖性。我会发布一个答案,我希望它能在几分钟内解决你的问题。人力资源管理,很有趣。更改两行
myArtifactTask.all(…).value
(test in test).all(…).value
的顺序会改变什么吗?我的印象是,像上面这样的设置仍然允许sbt在我所有的
myArtifactTask
结果之前运行测试,因为它们之间没有明确的顺序。我误解了吗?事实上你是对的。也许顺序不会改变,但它们可以并行运行。我将用更好的解决方案更新我的答案。
object MyBuild extends Build {
  val myArtifactTask = TaskKey[Unit]("my-artifact-task", "My Artifact Task")
}
myArtifactTask := {
  println("myArtifactTask:project-a")
}
myArtifactTask := {
  println("myArtifactTask:project-b")
}
lazy val testedArtifact = taskKey[Unit]("Runs myArtifactTask followed by tests")

lazy val inAnyProjectButRoot: ScopeFilter = ScopeFilter (
  inAnyProject -- inProjects(ThisProject)
)

myArtifactTask := {
  myArtifactTask.all(inAnyProjectButRoot).value
}

testedArtifact := {
 (test in Test).all(anyProjectButRoot).value
}

testedArtifact <<= testedArtifact.dependsOn(myArtifactTask)