Scala SBT:编译前为子模块生成代码

Scala SBT:编译前为子模块生成代码,scala,sbt,code-generation,Scala,Sbt,Code Generation,我对build.sbt配置有以下问题。 我需要在编译之前生成一些代码。 这就是它现在的工作原理 lazy val rootProject=project.in(文件(“.”) lazy val rootSourceGenerator=Def.task{ val f:File=(sourceManaged in Compile).value/“com”/“myproject”/“Version.scala” 写( F s“”包com.myproject | |对象版本{ |一些代码。。。 |} |

我对build.sbt配置有以下问题。 我需要在编译之前生成一些代码。 这就是它现在的工作原理

lazy val rootProject=project.in(文件(“.”)
lazy val rootSourceGenerator=Def.task{
val f:File=(sourceManaged in Compile).value/“com”/“myproject”/“Version.scala”
写(
F
s“”包com.myproject
|
|对象版本{
|一些代码。。。
|}
|“.stripMargin”
)
序号(f)
}
inConfig(编译)(
序号(
sourceGenerators+=rootSourceGenerator
))
现在我需要为一个新的子模块做同样的事情

lazy val rootProject = project.in(file(".")).dependsOn(submodule)
lazy val submodule = project.in(file("submodule"))

lazy val submoduleSourceGenerator = Def.task {
  val f: File = (sourceManaged in (submodule, Compile)).value / "com" / "myproject" / "SubmoduleVersion.scala"

  IO.write(
    f,
    s"""package com.myproject
       |
       |object SubmoduleVersion {
       |  some code ...
       |}
       |""".stripMargin
  )

  Seq(f)
}

inConfig(submodule / Compile)(
  Seq(
    sourceGenerators += submoduleSourceGenerator
  ))
而图(子模块/编译)中的
不起作用。错误是关于
/
的语法未知。
有什么建议可以解决这个问题吗?

有多种解决方案,但我认为最干净的解决方案如下

项目/GenerateVersion.scala中创建一个包含以下内容的

导入sbt.Keys_
进口sbt_
对象生成转换扩展了AutoPlugin{
超越def触发器=noTrigger
覆盖def项目设置:Seq[定义设置[]]={
序号(
编译中的sourceGenerators+=Def.task{
val f:文件=
(sourceManaged in Compile).value/“com”/“myproject”/“Version.scala”
写(
F
s“”包com.myproject
|
|对象版本{
|}
|“.stripMargin”
)
序号(f)
}.taskValue
)
}
}
为所有需要
Version.scala
生成的项目/子模块启用新创建的插件
GenerateVersion
。可以在
build.sbt

lazy val submoduleSourceGenerator = Def.task {
  val f: File = (sourceManaged in Compile).value / "com" / "myproject" / "SubmoduleVersion.scala"

  IO.write(
    f,
    s"""package com.myproject
       |
       |object SubmoduleVersion {
       |  some code ...
       |}
       |""".stripMargin
  )

  Seq(f)
}

inConfig(Compile)(
  Seq(
    sourceGenerators += submoduleSourceGenerator
  ))
lazy val sub=project
.in(文件(“子文件”))
.启用插件(GenerateVersion)
lazy val root=project
.in(文件(“.”)
.启用插件(GenerateVersion)
.总计(分)
当触发根任务时,
aggregate(sub)
被添加到
sub
模块中运行任务。例如,
sbt compile
将同时运行
sbt“root/compile”和“sub/compile”

该解决方案更容易以SBT插件的形式跨多个SBT项目共享


另外,您可能对插件感兴趣,有多种解决方案,但我认为最干净的解决方案如下

项目/GenerateVersion.scala中创建一个包含以下内容的

导入sbt.Keys_
进口sbt_
对象生成转换扩展了AutoPlugin{
超越def触发器=noTrigger
覆盖def项目设置:Seq[定义设置[]]={
序号(
编译中的sourceGenerators+=Def.task{
val f:文件=
(sourceManaged in Compile).value/“com”/“myproject”/“Version.scala”
写(
F
s“”包com.myproject
|
|对象版本{
|}
|“.stripMargin”
)
序号(f)
}.taskValue
)
}
}
为所有需要
Version.scala
生成的项目/子模块启用新创建的插件
GenerateVersion
。可以在
build.sbt

lazy val submoduleSourceGenerator = Def.task {
  val f: File = (sourceManaged in Compile).value / "com" / "myproject" / "SubmoduleVersion.scala"

  IO.write(
    f,
    s"""package com.myproject
       |
       |object SubmoduleVersion {
       |  some code ...
       |}
       |""".stripMargin
  )

  Seq(f)
}

inConfig(Compile)(
  Seq(
    sourceGenerators += submoduleSourceGenerator
  ))
lazy val sub=project
.in(文件(“子文件”))
.启用插件(GenerateVersion)
lazy val root=project
.in(文件(“.”)
.启用插件(GenerateVersion)
.总计(分)
当触发根任务时,
aggregate(sub)
被添加到
sub
模块中运行任务。例如,
sbt compile
将同时运行
sbt“root/compile”和“sub/compile”

该解决方案更容易以SBT插件的形式跨多个SBT项目共享


另外,您可能对插件感兴趣

谢谢,Ivan Stanislavciuc!但我找到了另一个解决办法。 只需将以下所有内容添加到
/subproject/build.sbt

lazy val submoduleSourceGenerator = Def.task {
  val f: File = (sourceManaged in Compile).value / "com" / "myproject" / "SubmoduleVersion.scala"

  IO.write(
    f,
    s"""package com.myproject
       |
       |object SubmoduleVersion {
       |  some code ...
       |}
       |""".stripMargin
  )

  Seq(f)
}

inConfig(Compile)(
  Seq(
    sourceGenerators += submoduleSourceGenerator
  ))

谢谢,伊万·斯坦尼斯拉夫!但我找到了另一个解决办法。 只需将以下所有内容添加到
/subproject/build.sbt

lazy val submoduleSourceGenerator = Def.task {
  val f: File = (sourceManaged in Compile).value / "com" / "myproject" / "SubmoduleVersion.scala"

  IO.write(
    f,
    s"""package com.myproject
       |
       |object SubmoduleVersion {
       |  some code ...
       |}
       |""".stripMargin
  )

  Seq(f)
}

inConfig(Compile)(
  Seq(
    sourceGenerators += submoduleSourceGenerator
  ))