我有一组.proto文件(protobuf),我使用scalapb生成java。我在同一个sbt2子项目中也有,一个是scalaversion2.11兼容的(由于缺少包而无法升级到2.12),另一个是scala2.12。
我创建了一个子项目来保存我的proto,默认情况下使用2.12,我的2.12子项目可以使用它,但我的2.11不能。
我将crossscalaversations设置为2.11/2.12,我用这两个值编译了我的项目,结果都通过了,但即使这样,我也无法让2.11子项目找到代码。
我“想知道”如果这是一些支持,或者如果有一个轨道,我可以使用一个单一的位置来持有我的.proto,但我的2个子项目使用相同的sbt文件使用这些。
lazy val scala212 = "2.12.13"
lazy val scala211 = "2.11.12"
lazy val supportedScalaVersion = List(scala212, scala211)
ThisBuild / scalaVersion := scala212
lazy val root = (project in file("."))
.aggregate(proto, subproject1, subproject2)
.settigns(
crossScalaVersions := Nil,
publish / skip := true
)
lazy val proto = project
.settings(
crossScalaVersions := supportedScalaVersions,
name := "proto",
libraryDependencies += "com.trueaccord.scalapb" %% "scalapb-runtime" % com.trueaccord.scalapb.compiler.Version.scalapbVersion % "protobuf",
PB.targets in Compile := Seq(
scalapb.gen(grpc = false) -> (sourceManaged in Compile).value / "protobuf"
)
)
lazy val subproject1 = project
.dependsOn(proto)
lazy val subproject2 = project
.settings(
scalaVersion := scala211
)
.dependsOn(proto)
所以,从上面看,如果我这样做了 sbt "+ proto"
我可以编译两个版本。如果我这样做了 sbt subproject1/compile
它也起作用。使用 sbt subproject2/compile
失败,表示找不到2.11:proto jar文件。
或者,我希望上面的方法能够很好地工作,或者任何其他技巧,我可以从相同的proto位置生成代码,但是在subproject1/subproject2中。
1条答案
按热度按时间aelbi1ox1#
您可以尝试使用sbt projectmatrix插件:https://github.com/sbt/sbt-projectmatrix 其思想是为不同的scala版本提供单独的sbt子项目,因此在调用时可以简单地引用相关的子项目
dependsOn
.我认为这个插件终有一天会出现在sbt中,因为它总的来说是一个比当前内置的有状态交叉编译支持更好的解决方案,它是由eugene yokota开发的,他也是sbt的开发人员。