【发布时间】:2019-03-02 22:11:10
【问题描述】:
在我的 SBT 项目中,我有一个输入文件 src/main/greeting/Greeting.txt,其内容如下:
Hello, world!
这是我的build.sbt,它从Greeting.txt 文件生成Scala 源代码:
sourceGenerators in Compile += Def.task{
println("GENERATING FILES")
val inputFile = file("src/main/greeting/Greeting.txt")
val generatedFile =
(sourceManaged in Compile).value / "scala" / "Main.scala"
val greeting = IO.read(inputFile).trim
IO.write(
generatedFile,
s"""object Main extends App { println("${greeting}") }"""
)
Seq(generatedFile)
}.taskValue
这个build.sbt 工作正常,除了它运行我的任务以生成 Scala 源代码每次我编译/运行我的项目。我希望它仅在Greeting.txt-文件更改时运行这些任务。我怎样才能做到这一点?
MCVE
生成项目的 Bash 脚本:
#!/bin/bash
mkdir sourceGeneratorsExample
cd sourceGeneratorsExample
mkdir -p src/main/scala
mkdir -p src/main/greeting
echo "Hello, world!" >> src/main/greeting/Greeting.txt
cat <<HEREDOC > build.sbt
sourceGenerators in Compile += Def.task{
println("GENERATING FILES")
val inputFile = file("src/main/greeting/Greeting.txt")
val generatedFile =
(sourceManaged in Compile).value / "scala" / "Main.scala"
val greeting = IO.read(inputFile).trim
IO.write(
generatedFile,
"object Main extends App { println(\"" + greeting + "\") }"
)
Seq(generatedFile)
}.taskValue
HEREDOC
重复/文档
- This 是 2012 年的答案,从那时起发生了很多变化。
-
current reference manual 建议使用 "
sbt.Tracked.{ inputChanged, outputChanged }etc",但没有对此进行扩展,并且手册中的其他任何地方都没有提到Tracked对象。
【问题讨论】:
-
这是一个示例,来自我自己的构建,关于如何将
sourceGenerators与FileFunction.cached结合起来:github.com/NetLogo/NetLogo-Headless/blob/…