Scala SBT:编译前为子模块生成代码
我对build.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 | |对象版本{ |一些代码。。。 |} |
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
))