【问题标题】:sbt subproject aggregation and dependency behaviorsbt 子项目聚合和依赖行为
【发布时间】:2014-06-24 19:59:25
【问题描述】:

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

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

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

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

但是,这似乎对订单没有任何实际影响,而且我肯定看到一些子项目在其他人运行 myArtifactsTask 之前运行测试。我猜我不完全理解all 的工作原理,可能是说每个独立子项目的test 任务都依赖于同一个子项目的myArtifactsTask?如果是这种情况,我该如何指定我想要的?它是否记录在我错过的某个地方?该手册描述了all 的基础知识,但没有描述它如何与其他构造交互。

【问题讨论】:

  • 你的myArtifactsTask 打电话给assembly 吗?你有没有通过例如禁用它? test in assembly := {} ?
  • @lpiepiora 你能详细说明那会做什么吗?我没有禁用它,但我不太明白它会如何改变。
  • 抱歉,我太快下结论了。我想也许你的一些任务已经调用了测试,而 SBT 只评估一个任务键一次。但是我认为 SBT 会抱怨循环依赖。我会发布一个答案,希望能在几分钟内解决您的问题。

标签: scala sbt


【解决方案1】:

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

您可以做的是 - 假设您有三个项目。根和两个子项目。我假设密钥myArtifactTask 是在根目录中定义的。

project/Build.scala

object MyBuild extends Build {
  val myArtifactTask = TaskKey[Unit]("my-artifact-task", "My Artifact Task")
}

myArtifactTask 在两个子项目中都实现了。

subproject-a/build.sbt

myArtifactTask := {
  println("myArtifactTask:project-a")
}

subproject-a/build.sbt

myArtifactTask := {
  println("myArtifactTask:project-b")
}

您要做的是以在两个项目中调用 myArtifactTask 的方式定义您的根的build.sbt。然后你可以定义新的任务testedArtifact,它依赖于myArtifactTask

build.sbt

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)

现在在根项目中调用testedArtifact将首先调用子项目中的所有myArtifactTasks,然后进行测试。

【讨论】:

  • 嗯,很有趣。更改myArtifactTask.all(...).value(test in Test).all(...).value 两行的顺序会改变什么吗?我的印象是,像上面这样的设置仍然允许 sbt 在我的所有myArtifactTask 结果之前运行测试,因为它们之间没有明确的顺序。我是不是误会了?
  • 其实你是对的。也许顺序不会改变,但它们可以并行运行。我会用更好的解决方案更新我的答案。
猜你喜欢
  • 2018-03-13
  • 2011-08-27
  • 2011-05-30
  • 1970-01-01
  • 2018-03-20
  • 2017-04-18
  • 2015-09-05
  • 2013-08-08
  • 1970-01-01
相关资源
最近更新 更多