【问题标题】:sbt: Dependent project does not compile firstsbt:依赖项目不先编译
【发布时间】:2021-05-12 01:48:34
【问题描述】:

在我的build.sbt(没什么花哨的)....

val common: Project =
  project
    .in(file("common"))
    .enablePlugins(...)
    .settings(libraryDependencies ++= ...)

val root =
project
      .in(file("."))
      .enablePlugins(...)
      .dependsOn(common)
      .aggregate(
        common,
        ....
      )
      .settings(...)

问题

common 不会在root 之前编译,因此编译失败并抱怨找不到这些类(共同)

仅供参考

  • 我在搜索有关此问题的一些信息(谷歌、文档、github 问题等)时尝试了很多方法。没有运气。
  • sbt v1.4.9(播放项目 sbt-play v2.7.9)
  • build.sbt 比您在上面看到的要大得多(依赖项、任务等)。否则,我不认为这有什么特别或棘手的地方。

非常感谢您的帮助!

【问题讨论】:

  • 为什么依赖和聚合?我想这就是问题所在。
  • 哦,那是我试错的最后状态。我试过两者之一,它不起作用。
  • 嗯,这很奇怪。 depends 一直为我工作,而不是 Play 用户。您是否在更改之间重新加载您的构建定义?你能创建一个最小的 git repo 来重现问题吗?
  • 我正在创建一个示例项目......在我将它作为 git repo 分享之前还有一段时间。
  • 无法在独立项目中重现 :crying:

标签: scala sbt


【解决方案1】:

为避免初始化问题,请尝试将项目声明为惰性验证

lazy val common = ...
lazy val root = ...

而不是严格的 vals

val common = ...
val root = ...

作为旁注使用dependsOn 来建立子项目之间的顺序,而不是aggregate,因为aggregate 不会修改类路径。

【讨论】:

  • 尝试添加lazy val .. 仍然不起作用:(
  • 您可能在项目引用中有一个循环。从您的 sn-p 可以清楚地看出,root 指的是common - 可能common 也指的是设置中的某处的root
  • 这是有道理的......现在正在检查周期。
【解决方案2】:

我同意 Mario Galic 使用 lazy val 的观点。事实上,我建议在 build.sbt 中始终使用 lazy val

如果有一个循环,比如common 引用回root,你可以使用的一种技术是使用LocalProject("project name"),比如LocalProject("root")

lazy val common = (project in file("common"))
  .settings(
    Test / test := (LocalProject("root") / Test / test).value
  )

【讨论】:

  • 我在 build.sbt 中的所有声明都是lazy vals ...正在跟踪查看是否有循环...到目前为止还没有发现任何东西。
  • 您能否更新问题描述并复制粘贴您看到的确切错误消息?如果我们的机器上没有可重现的 sn-p,我们只能猜测实际发生的情况。
  • 我得到的编译错误无法从常见的类中找到。但我所做的是将常见的和其他几个子项目移动到单独的项目/存储库中。尽管这不是解决方案,而是解决方法,但这让我对此有所了解。
猜你喜欢
  • 2016-04-05
  • 2013-11-18
  • 1970-01-01
  • 2018-03-20
  • 2017-04-17
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
相关资源
最近更新 更多