SBT中的相对路径使用多个嵌套项目构建

时间:2014-04-17 08:09:19

标签: scala sbt

我的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文档,<+=

1 个答案:

答案 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

通过从FileRichFile的隐式转换,可以使/方法可用。 file / "test"将由Scala编译器重写为new RichFile(file)./("test")

实际上,您不必理解这一点:只需使用/作为运算符来组合文件夹(作为File)和路径段(作为String })。

<+=运算符

<+=运算符是here,但我不认为这会有所帮助,因为存在某种宏观和隐含的魔法。

SBT 0.13.x

中的简化运算符

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