【问题标题】:Relative paths in SBT builds with multiple nested projects具有多个嵌套项目的 SBT 构建中的相对路径
【发布时间】:2016-08-10 08:17:25
【问题描述】:

我有一个看起来像这样的 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 构建与父“根”构建相互嵌套不安全吗?

附言在旁注中,有人可以指向 / 运算符和 &lt;+= 的 api 文档

【问题讨论】:

    标签: scala sbt


    【解决方案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)。

    &lt;+=运营商

    &lt;+= 运算符是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
    

    【讨论】:

      猜你喜欢
      • 2017-10-19
      • 1970-01-01
      • 2017-04-07
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      相关资源
      最近更新 更多