SBT 0.13 Build.scala参考未定义的设置

时间:2014-08-14 12:44:26

标签: scala sbt

我是SBT的新手,我一直在尝试为此版本构建自定义任务。

我有一个简单的构建项目:

import sbt._
import Keys._

object JsonBuild extends Build{

    lazy val barTask = taskKey[Unit]("some simple task")
    val afterTestTask1 = barTask := { println("tests ran!") }
    val afterTestTask2 = barTask <<= barTask.dependsOn(test in Test)

    lazy val myBarTask = taskKey[Unit]("some simple task")
    //val afterMyBarTask1 = myBarTask := { println("tests ran!") }
    lazy val afterMyBarTask2 = myBarTask <<= (myBarTask).dependsOn(test in Test) map { _ => println("tests ran!") }

    //settings ++ Seq(afterMyBarTask2)
    override lazy val settings = super.settings ++ Seq(afterMyBarTask2)
}

我一直收到错误:

References to undefined settings:

  {.}/*:myBarTask from {.}/*:myBarTask (C:\Users\haques\Documents\workspace\SBT\jsonParser\project\Build.scala:13)

  {.}/test:test from {.}/*:myBarTask (C:\Users\haques\Documents\workspace\SBT\jsonParser\project\Build.scala:13)
     Did you mean test:test ?

我用谷歌搜索过,我找不到解决办法。

你能解释一下它为什么不起作用吗?

2 个答案:

答案 0 :(得分:1)

lazy val myBarTask = taskKey[Unit]("some simple task")
override lazy val settings = super.settings ++ Seq(myBarTask := { (test in Test).value; println("tests ran!") } )
致电myBarTask时,

dependsOn未定义。你应该在使用dependsOn之前定义它。同时value调用键(任务/设置)是依赖其他键的首选方式。您仍然可以使用您的版本,但请定义myBarTask

答案 1 :(得分:1)

这一直困扰着。

我做了一些阅读。

我想我知道为什么上面的代码不起作用。

lazy val afterMyBarTask2 = myBarTask <<= (myBarTask).dependsOn(test in Test) map { _ => println("tests ran!") }

当我写(myBarTask).dependsOn(Test in test)时,测试的项目范围由SBT选择为ThisBuild。

{。} / test:test 来自{。} / *:myBarTask(C:\ Users \ haques \ Documents \ workspace \ SBT \ jsonParser \ project \ Build.scala:13)

ThisBuild项目范围在配置测试中没有 test 设置。

只有 项目 才能设置 测试

关键我认为该设置是由一些默认的SBT插件添加到项目设置中的。

使用inspect命令检查SBT中存在哪些范围设置。

如果您输入SBT REPL:

/测试{}:测试

输出结果为:

检查{。} / test:test [info]没有密钥输入。

SBT正确建议: 测试:测试是:

{文件:/ C:/用户/ haques /文档/工作区/ SBT / jsonParser /} jsonparser /测试:测试

如果未在项目范围轴中指定项目,SBT默认选择当前项目。

如果未指定,每个SBT项目都有自己的项目设置。