sbt,情侣问题:dependsOn

时间:2017-01-26 13:04:31

标签: scala sbt release ivy multi-project

我对SBT有一些疑问:

1)我想知道为什么有一个选项可以使用' dependOn'条款。我完全明白它加入了项目。

lazy val projectA = Project("A", file("a"))
lazy val projectB = Project("B", file("b")).dependsOn(projectA)

我在此代码中不喜欢的内容:您无法在projectB中指定projectA的版本。它总是聚合projectA的最新状态。如果每个子项目彼此紧密耦合,为什么要将应用程序拆分为多项目?

还有另一种选择。我们可以使用版本在二进制存储库中发布子项目,并将其作为依赖项添加到设置中。

为什么不使用此代码:

lazy val projectA = project("A", file("a"))
lazy val projectB = Project("B", file("b")).settings(libraryDependencies ++= Seq("groupOfA" %% "A" % "versionOfA"))

当然,你需要有二进制存储库。但这不是问题,您可以在本地安装nexus(它几乎支持所有内容并免费使用),或者使用oss.sonatype.org。

2)这个问题与第一个问题有关,我不明白为什么会有“发布本地”问题。任务。据我所知,SBT使用Ivy2存储库,但是当您将项目发布到nexus或oss.sonatype.org时,您将其发布到maven2 repo。当sbt检测到本地发布并从maven缓存时会出现问题。它会引发错误。我认为这是sbt bug(https://github.com/sbt/sbt/issues/2687)。我不再使用publishLocal了,如果你想将应用程序拆分成多个组件,我不明白为什么不在你的机器上安装二进制存储库。

1 个答案:

答案 0 :(得分:1)

正如您所指出的,libraryDependencies对于多项目管理而言比dependsOn更为强大,代价是增加了复杂性。

您甚至不需要安装单独的二进制存储库,您的本地存储库非常适合发布到publishLocal

这将我们带到您的下一个问题,这就是为什么在默认情况下发布到Ivy时使用publishLocal的原因?两件事:首先,设置本地发布以Maven风格发布:http://www.scala-sbt.org/0.13/docs/Publishing.html#Modifying+the+generated+POMpublishMavenStyle := true)。

其次,关于本地发布和从Maven Central缓存的相同版本的问题。简短的回答:不要这样做。如果您发布到Maven Central,您应该只使用本地发布进行测试,并且只应该publishLocal ' SNAPTSHOT'版本。您应该只向Maven Central发布固定版本号。然后没有冲突。这就是Maven的设计方式;版本号应该是不可变的,并且“SNAPSHOT”应仅用于测试。