在SBT中使用自定义任务引用未定义的设置错误?

时间:2014-03-10 13:25:14

标签: sbt

我在SBT中创建了一个创建格式正确的类路径的任务,但是当我尝试compile时,我得到一个未定义的设置错误。该错误不足以告诉我哪些设置未定义:

[error] Reference to undefined setting: 
[error] 
[error]   *:fullClasspath from *:fcp
[error]  

这适用于以下构建配置:

import sbt._
import Keys._

object TestBuild extends Build {
    override lazy val settings = super.settings ++ Seq(
        name := "blah", scalaVersion := "2.10.2"
    )

    lazy val fcp = TaskKey[String]("fcp", "create formatted classpath")
    lazy val fcpTask = fcp <<= fullClasspath map { tasks =>
        val cp = tasks.map(_.data.getName + ":")
        s"[Classpath]$cp[/Classpath]"
    }

    lazy val project = Project(
        "project", file("."), settings = settings ++ Seq(fcpTask)
    )
}

1 个答案:

答案 0 :(得分:8)

三件事:

1)您正在删除所有默认设置。创建项目时,您可以指定项目的完整设置列表(就像您当前正在做的那样)您可以设置配置添加到默认值。如果将项目定义更改为以下内容,则应该开始工作:

lazy val project = (
  Project("project", file("."))
  .settings(fcpTask)
)

2)您正在将设置放入Build本身。如果Project级别上不存在这些设置,则会查看Build的设置。但是,name之类的内容可能会在项目中定义。所以你的完整构建文件看起来像:

import sbt._
import Keys._

object TestBuild extends Build {
    lazy val fcp = TaskKey[String]("fcp", "create formatted classpath")
    lazy val fcpTask = fcp <<= fullClasspath map { tasks =>
        val cp = tasks.map(_.data.getName + ":")
        s"[Classpath]$cp[/Classpath]"
    }
    lazy val project = (
      Project("project", file("."))
      .settings(name := "blah", scalaVersion := "2.10.2")
      .settings(fcpTask)
    )
}

3)您应该选择要从中提取类路径的配置。选项:

  • 运行时:包括项目的已编译类+资源目录和依赖项
  • 编译:包括用于编译项目的依赖项
  • 测试:包括测试时使用的所有依赖项(包括项目本身)

之前您所拥有的内容相当于fullClasspath in Compile IIRC。

希望有所帮助!