我的SBT版本看起来像这样:
name := "foo"
version := "1.0"
lazy val schemaFile = settingKey[File]("File containing FIX schema for generator")
schemaFile := (resourceDirectory in Compile).value / "input.xml"
sourceGenerators in Compile <+= Def.task {
import my.project.SourceGenerator
lazy val filename : String = schemaFile.value.getName.toLowerCase.stripSuffix(".xml") + ".scala"
lazy val outFile : File = (sourceManaged in Compile).value / filename
outFile.getParentFile.mkdirs()
Seq(SourceGenerator.generate(schemaFile.value,outFile))
}
SourceGenerator.generate()
将输入* .xml转换为* .scala File
。
这在单独运行时似乎工作正常。现在,这实际上是一组较大项目的子目录,它们之间存在依赖关系。因此,我尝试按照SBT指南创建一个级别的父 bulid.sbt 文件,并将此项目包括在内:
// build.sbt in the directory directly above foo's build.sbt
lazy val foo = project
lazy val bar = project dependsOn foo
现在,当我尝试加载此配置时,我收到如下错误:
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? r
C:\**\rootproj\foo\build.sbt:7: error: type mismatch;
found : java.io.File
required: T
schemaFile := (resourceDirectory in Compile).value / "input.xml"
这里发生了什么?我是以错误的方式解决这个问题 - 也就是说将sbt版本嵌套在另一个内部是非常安全的,而父母&#39; root&#39;建?
P.S。在旁注上,有人可以指向/
运算符的api文档,<+=
答案 0 :(得分:1)
我无法重现你的问题。当我做类似的事情时,它会起作用。
我将build.sbt
文件保存在foo
文件夹中,并在父文件夹中的另一个build.sbt
中声明项目和依赖项,这恰好是最顶层的项目。我正在使用SBT 0.13.2
。
我已设置以下内容:
lazy val root = project.in(file(".")).aggregate(foo, bar)
lazy val foo = project
lazy val bar = project.dependsOn(foo)
但删除第一行确实会让它像你一样失败。我怀疑你有另一个编译问题,或者只是因为我无法弄清楚你的确切情况。
/
运算符 /
运算符为here。
通过从File
到RichFile
的隐式转换,可以使/
方法可用。 file / "test"
将由Scala编译器重写为new RichFile(file)./("test")
。
实际上,您不必理解这一点:只需使用/
作为运算符来组合文件夹(作为File
)和路径段(作为String
})。
<+=
运算符 <+=
运算符是here,但我不认为这会有所帮助,因为存在某种宏观和隐含的魔法。
SBT版本0.12.x之前在文档中提到过此运算符,但不再是版本0.13.x,或者只是作为跟踪。在您似乎正在使用的0.13.x版本中,键上的许多隐含运算符应该被更小的更熟悉的运算符替换并使用value
方法。
:=
(分配,=
无法使用)+=
(添加一项)++=
(添加几项)您也可以编写如下代码。在这里,我们尝试将Task
(更确切地说是Task[Seq[File]]
)添加到Seq[Task]
(更确切地说是Seq[Task[Seq[File]]]
),因此我们只想添加一个任务并使用+=
运算符。 taskValue
允许您延迟对任务的评估。
sourceGenerators in Compile += Def.task {
lazy val filename : String = schemaFile.value.getName.toLowerCase.stripSuffix(".xml") + ".scala"
lazy val outFile : File = (sourceManaged in Compile).value / filename
outFile.getParentFile.mkdirs()
Seq(generate(schemaFile.value, outFile))
}.taskValue