sbt,几个问题:取决于
sbt, couple questions: dependsOn
我对 SBT 有一些疑问:
1) 我想知道为什么有使用 'dependOn' 子句的选项。我完全理解它加入项目。
lazy val projectA = Project("A", file("a"))
lazy val projectB = Project("B", file("b")).dependsOn(projectA)
我不喜欢这段代码的地方:你不能在项目 B 中指定项目 A 的版本。它总是汇总 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) 这个问题和第一个问题有关,我不明白为什么会有'publishLocal'任务。据我所知,SBT 使用 Ivy2 存储库,但是当您将项目发布到 nexus 或 oss.sonatype.org 时,您将其发布到 maven2 存储库。当 sbt 检测到从 maven 本地发布和缓存时,就会出现问题。它会抛出错误。我认为这是 sbt 错误 (https://github.com/sbt/sbt/issues/2687)。我不再使用 publishLocal,我不明白如果你想将你的应用程序拆分成多个组件,为什么不在你的机器上安装二进制存储库。
如您所述,libraryDependencies
在 multi-project 管理方面严格来说比 dependsOn
更强大,但代价是增加了复杂性。
您甚至不需要安装单独的二进制存储库,您的本地存储库足以发布 publishLocal
。
这让我们想到了您的下一个问题,即为什么在默认情况下发布到 Ivy 时使用 publishLocal
?两件事:首先,设置本地发布以 Maven 风格发布:http://www.scala-sbt.org/0.13/docs/Publishing.html#Modifying+the+generated+POM (publishMavenStyle := true
).
其次,关于从 Maven Central 在本地发布和缓存相同版本时出现的问题。简短回答:不要那样做。 如果您发布到 Maven Central,您应该使用本地发布仅用于 测试, 并且应该 publishLocal
只有 'SNAPTSHOT' 版本。您应该只向 Maven Central 发布固定版本号。那么就不冲突了。这就是 Maven 的设计方式;版本号应该是不可变的,“SNAPSHOT”应该仅用于测试。
我对 SBT 有一些疑问:
1) 我想知道为什么有使用 'dependOn' 子句的选项。我完全理解它加入项目。
lazy val projectA = Project("A", file("a"))
lazy val projectB = Project("B", file("b")).dependsOn(projectA)
我不喜欢这段代码的地方:你不能在项目 B 中指定项目 A 的版本。它总是汇总 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) 这个问题和第一个问题有关,我不明白为什么会有'publishLocal'任务。据我所知,SBT 使用 Ivy2 存储库,但是当您将项目发布到 nexus 或 oss.sonatype.org 时,您将其发布到 maven2 存储库。当 sbt 检测到从 maven 本地发布和缓存时,就会出现问题。它会抛出错误。我认为这是 sbt 错误 (https://github.com/sbt/sbt/issues/2687)。我不再使用 publishLocal,我不明白如果你想将你的应用程序拆分成多个组件,为什么不在你的机器上安装二进制存储库。
如您所述,libraryDependencies
在 multi-project 管理方面严格来说比 dependsOn
更强大,但代价是增加了复杂性。
您甚至不需要安装单独的二进制存储库,您的本地存储库足以发布 publishLocal
。
这让我们想到了您的下一个问题,即为什么在默认情况下发布到 Ivy 时使用 publishLocal
?两件事:首先,设置本地发布以 Maven 风格发布:http://www.scala-sbt.org/0.13/docs/Publishing.html#Modifying+the+generated+POM (publishMavenStyle := true
).
其次,关于从 Maven Central 在本地发布和缓存相同版本时出现的问题。简短回答:不要那样做。 如果您发布到 Maven Central,您应该使用本地发布仅用于 测试, 并且应该 publishLocal
只有 'SNAPTSHOT' 版本。您应该只向 Maven Central 发布固定版本号。那么就不冲突了。这就是 Maven 的设计方式;版本号应该是不可变的,“SNAPSHOT”应该仅用于测试。