Scala sbt多模块项目:项目之间的依赖关系

Scala sbt多模块项目:项目之间的依赖关系,scala,sbt,Scala,Sbt,我是Scala的新手,所以我希望这个问题不要太幼稚 假设我有一个项目,项目之间存在依赖关系 lazy val core = (project in file("core")). settings( ... ) lazy val utils = (project in file("utils")). settings( ... ).dependsOn(core) 问题是,dependsOncore是否意味着如果我做项目utils;编译它会事先编译内核并使用它的最新版本吗

我是Scala的新手,所以我希望这个问题不要太幼稚

假设我有一个项目,项目之间存在依赖关系

  lazy val core = (project in file("core")).
    settings( ... )

  lazy val utils = (project in file("utils")).
    settings( ... ).dependsOn(core)
问题是,dependsOncore是否意味着如果我做项目utils;编译它会事先编译内核并使用它的最新版本吗

我问这个问题,因为在实践中我没有看到这种行为,我想要它

您正在寻找聚合方法。像这样:

lazy val utils = (project in file("utils")).
  settings( ... ).dependsOn(core).aggregate(core)

这里的聚合方法导致在UTIL上运行的所有任务也在核心更新上运行,等等。。。。如果您想禁止任务在聚合项目上运行,您可以签出

是的,您应该看到这种行为,我在实践中确实看到了。正如链接文档所述,注意util和core的角色是相反的:core依赖于util:

这也会在编译项目时创建项目之间的顺序;必须先更新和编译util,然后才能编译core


谢谢因此,添加了聚合选项,它起了作用;但是如果现在在utils中我发布本地的,会发生什么呢?发布的包会包含core吗?发布的包将始终包含core,因为您依赖它。如果您保持这样,publish命令也将在core上运行。您可以禁止在其他项目上运行特定命令。我将用这些信息和相关文档的链接更新我的答案。其他答案所说的聚合设置如何?你怎么看?我也不明白你为什么说依赖是相反的;就像这里的文档所说的,foo dependsOnbar意味着foo中的编译配置取决于bar中的编译配置。使用相同的逻辑,UTIL依赖于核心。我说的对吗?@Daniel他们的例子有lazy val core=project.dependsOnutil。@Daniel和aggregate不应该是必需的,但是是的,它的效果是编译utils也会编译core;不过,我不知道它是否提供了任何关于排序的额外保证,因此它可以先编译utils目录中的文件,然后再编译核心文件(如果dependsOn不够)。