其中大部分在单个源代码树中的 sbt 中得到了很好的支持
通常不需要版本特定的源目录。 Scala 程序往往是源兼容的——事实上经常如此
交叉建筑(http://www.scala-sbt.org/release/docs/Detailed-Topics/Cross-Build http://www.scala-sbt.org/release/docs/Detailed-Topics/Cross-Build) 在 sbt 方面拥有一流的支持。
如果您确实需要特定于版本的代码,您可以添加额外的源文件夹。
将其放入 build.sbt 文件中,除了常规的“src/main/scala”之外,还会在交叉构建时添加“src/main/scala-[scalaVersion]”作为每个版本的源目录。
(还有一个插件可用于在版本之间生成垫片,但我还没有尝试过 -https://github.com/sbt/sbt-scalashim https://github.com/sbt/sbt-scalashim)
unmanagedSourceDirectories in Compile <+= (sourceDirectory in Compile, scalaVersion){ (s,v) => s / ("scala-"+v) }
版本特定的源 jar - 请参阅交叉构建,开箱即用
一体化部署——https://github.com/sbt/sbt-release https://github.com/sbt/sbt-release(也有很棒的 git 集成)
Maven 最终用户 -http://www.scala-sbt.org/release/docs/Detailed-Topics/Publishing.html http://www.scala-sbt.org/release/docs/Detailed-Topics/Publishing.html
阴影 - 我用过这个https://github.com/sbt/sbt-assemble https://github.com/sbt/sbt-assembly这对我的需求来说效果很好。
您的程序集插件问题可以通过重写生成的 pom.xml 来解决。
这是一个删除 joda-time 的示例。
pomPostProcess := {
import xml.transform._
new RuleTransformer(new RewriteRule{
override def transform(node:xml.Node) = {
if((node \ "groupId").text == "joda-time") xml.NodeSeq.Empty else node
}
})
}
完整的build.sbt供参考
scalaVersion := "2.9.2"
crossScalaVersions := Seq("2.9.2", "2.10.0-RC5")
unmanagedSourceDirectories in Compile <+= (sourceDirectory in Compile, scalaVersion){ (s,v) => s / ("scala-"+v) }
libraryDependencies += "joda-time" % "joda-time" % "1.6.2"
libraryDependencies += "org.mindrot" % "jbcrypt" % "0.3m"
pomPostProcess := {
import xml.transform._
new RuleTransformer(new RewriteRule{
override def transform(node:xml.Node) = {
if((node \ "groupId").text == "joda-time") xml.NodeSeq.Empty else node
}
})
}