【问题标题】:print not accepted in task definition in SBT 0.13?SBT 0.13 的任务定义中不接受打印?
【发布时间】:2014-01-04 20:48:45
【问题描述】:

我正在使用 SBT 0.13.1

project/build.properties如下:

sbt.version=0.13.1

执行sbt about 会打印出以下内容:

$ sbt
[info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins
[info] Loading project definition from /Users/jacek/sandbox/so/sbt-0.13.1/project
[info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/)
[sbt-0-13-1]> about
[info] This is sbt 0.13.1
[info] The current project is {file:/Users/jacek/sandbox/so/sbt-0.13.1/}sbt-0-13-1 0.1-SNAPSHOT
[info] The current project is built against Scala 2.10.4-RC1
[info] Available Plugins: com.typesafe.sbt.SbtGit, com.typesafe.sbt.SbtProguard, growl.GrowlingTests, np.Plugin, net.virtualvoid.sbt.graph.Plugin, com.timushev.sbt.updates.UpdatesPlugin
[info] sbt, sbt plugins, and build definitions are using Scala 2.10.3

使用以下任务 - hello - 在build.sbt

scalaVersion := "2.10.4-RC1"

lazy val hello = taskKey[Unit]("An example task")

hello := {
  print("Sleeping for a sec...")
  println("done.")
}

...和reload,sbt 报告[error] Type error in expression

[sbt-0-13-1]> reload
[info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins
[info] Loading project definition from /Users/jacek/sandbox/so/sbt-0.13.1/project
/Users/jacek/sandbox/so/sbt-0.13.1/build.sbt:6: error: type mismatch;
 found   : String("Sleeping for a sec...")
 required: sbt.TaskKey[String]
  print("Sleeping for a sec...")
        ^
[error] Type error in expression
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore?

当我将print 更改为println 时,任务定义正确。

Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? r
[info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins
[info] Loading project definition from /Users/jacek/sandbox/so/sbt-0.13.1/project
[info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/)
[sbt-0-13-1]> hello
Sleeping for a sec...
done.
[success] Total time: 0 s, completed Jan 4, 2014 10:31:43 AM

print 在任务定义中不被接受吗?

【问题讨论】:

  • 我无法重现错误。
  • @Schleichardt 我添加了一些关于环境的更多细节。你使用的是 sbt 0.13.1 吗?
  • 谢谢,但我还是无法复制。我使用 SBT 0.13.1。您可以删除所有 SBT 插件然后重试吗?
  • 你是对的!感谢您的提示!当sbt -Dsbt.global.base=/tmp/so 时,hello 任务与print 一起使用。想知道什么可能会破坏它。
  • 你能回答哪个 SBT 插件破坏了构建吗?

标签: sbt


【解决方案1】:

schleichardt 的帮助下,我终于可以找出导致hello 任务中不接受print 问题的原因。

原来the sbt-dependency-graph plugin在全局配置目录,即~/.sbt/0.13/(或sbt.global.base指定的目录),sbt无法初始化任务,因此报错。

$ cat plugins/sbt-dependency-graph.sbt
addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.4")

$ cat sbt-dependency-graph.sbt
net.virtualvoid.sbt.graph.Plugin.graphSettings

要重现,请参阅build.sbtempty 全局配置目录中以 printnot println)开头的以下 sbt 会话:

jacek:~/sandbox/so/sbt-0.13.1
$ tree
.
├── build.sbt
└── project
    └── build.properties

1 directory, 2 files

jacek:~/sandbox/so/sbt-0.13.1
$ cat build.sbt
scalaVersion := "2.10.4-RC1"

lazy val hello = taskKey[Unit]("An example task")

hello := {
  print("Sleeping for a sec...")
  println("done.")
}

jacek:~/sandbox/so/sbt-0.13.1
$ sbt -Dsbt.global.base=/tmp/so
Getting org.scala-sbt sbt 0.13.1 ...
:: retrieving :: org.scala-sbt#boot-app
    confs: [default]
    43 artifacts copied, 0 already retrieved (12646kB/154ms)
Getting Scala 2.10.3 (for sbt)...
:: retrieving :: org.scala-sbt#boot-scala
    confs: [default]
    5 artifacts copied, 0 already retrieved (24447kB/204ms)
[info] Loading project definition from /Users/jacek/sandbox/so/sbt-0.13.1/project
[info] Updating {file:/Users/jacek/sandbox/so/sbt-0.13.1/project/}sbt-0-13-1-build...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/)
> hello
Sleeping for a sec...done.
[success] Total time: 0 s, completed Jan 4, 2014 1:35:22 PM

到目前为止它有效。

在全局配置目录中为the sbt-dependency-graph plugin 创建文件。

jacek:/tmp/so
$ cat plugins/sbt-dependency-graph.sbt
addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.4")

jacek:/tmp/so
$ cat sbt-dependency-graph.sbt
net.virtualvoid.sbt.graph.Plugin.graphSettings

...和reload.

> reload
[info] Loading global plugins from /private/tmp/so/plugins
[info] Updating {file:/tmp/so/plugins/}global-plugins...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Loading project definition from /Users/jacek/sandbox/so/sbt-0.13.1/project
[info] Updating {file:/Users/jacek/sandbox/so/sbt-0.13.1/project/}sbt-0-13-1-build...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
/Users/jacek/sandbox/so/sbt-0.13.1/build.sbt:6: error: type mismatch;
 found   : String("Sleeping for a sec...")
 required: sbt.TaskKey[String]
  print("Sleeping for a sec...")
        ^
[error] Type error in expression
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore?

print 更改为println(r)etry 时,它又可以正常工作了。

Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? r
[info] Loading global plugins from /private/tmp/so/plugins
[info] Loading project definition from /Users/jacek/sandbox/so/sbt-0.13.1/project
[info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/)
> hello
Sleeping for a sec...
done.
[success] Total time: 0 s, completed Jan 4, 2014 1:43:59 PM

【讨论】:

  • 这是一个很长的答案,说插件 (sbt-dependency-graph) 引入了一个与 Predef (print) 中的某些内容冲突的标识符。插件对于项目来说是全局的还是本地的并不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2013-12-05
  • 1970-01-01
  • 2014-05-23
  • 2014-06-04
相关资源
最近更新 更多