如何在 sbt 多项目中定义编译设置?

问题描述

我正在尝试使用 sbt multi-project 配置新的 Scala 构建。我想使用 sbt-protoc,特别是需要此配置设置的 ScalaPB:

Compile / PB.targets := Seq(
  scalapb.gen() -> (Compile / sourceManaged).value
)

现在的问题是如何在多项目中正确应用该 sbt.librarymanagement.Configurations.Compile 配置。我使用的是 Scala 2.13 和 sbt 1.4.7。

我目前的build.sbt

Compile / PB.targets := Seq(
  scalapb.gen() -> (Compile / sourceManaged).value
)

lazy val commonSettings = List(
  scalaVersion := scala212,scalacOptions ++= Seq(
    "utf8","-Ypartial-unification"
  )
)

lazy val core = (project in file("core"))
  .settings(
    commonSettings,name := "twirp4s-core",crossScalaVersions := Seq(scala212,scala213),libraryDependencies ++= Seq(
      catsCore,circeCore,circeGeneric,circeParser,http4sDsl,http4sCirce
    ),addCompilerPlugin(betterMonadicForPlugin),)

lazy val root = (project in file("."))
  .aggregate(core)
  .settings(
    name := "twirp4s-root",libraryDependencies += scalaTest % Test,skip in publish := true
  )

当我尝试编译我的项目时,编译器说:

[info] Protobufs files found,but PB.targets is empty.

解决方法

正如您已经发现的,@Seth 在评论中建议,将 Compile / PB.targets 移动到 core.settings 中是可行的。这是您应该使用的 build.sbt

lazy val commonSettings = List(
  scalaVersion := scala212,scalacOptions ++= Seq(
    "utf8","-Ypartial-unification"
  )
)

lazy val core = (project in file("core"))
  .settings(
    commonSettings,name := "twirp4s-core",crossScalaVersions := Seq(scala212,scala213),libraryDependencies ++= Seq(
      catsCore,circeCore,circeGeneric,circeParser,http4sDsl,http4sCirce
    ),addCompilerPlugin(betterMonadicForPlugin),Compile / PB.targets := Seq(
      scalapb.gen() -> (Compile / sourceManaged).value
    )
  )

lazy val root = (project in file("."))
  .aggregate(core)
  .settings(
    name := "twirp4s-root",libraryDependencies += scalaTest % Test,skip in publish := true
  )

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...