sbt:静默执行initialCommands

时间:2017-03-06 21:23:12

标签: scala sbt

是否可以静默执行initialCommands任务中的console,即好像

:silent

val $session = new foo.bar.Session()
import $session._
import $session.lib._

:silent

将这些命令放在initialCommands中不起作用,因为:<command>命令显然无法在initialCommands中使用:

Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_102).
Type in expressions for evaluation. Or try :help.

scala> <console>:2: error: illegal start of definition
:silent
^
Interpreter encountered errors during initialization!

[error] (Thread-1) java.lang.InterruptedException

java.lang.InterruptedException
    at java.util.concurrent.SynchronousQueue.put(SynchronousQueue.java:879)
    at scala.tools.nsc.interpreter.SplashLoop.run(InteractiveReader.scala:77)
    at java.lang.Thread.run(Thread.java:745)

2 个答案:

答案 0 :(得分:2)

不幸的是,从0.13.13开始,sbt提前运行initialCommands,而它正在创建解释器,并且在控制台有机会将解释器绑定为$intp之前。

这很接近:

$ sbt -Dscala.repl.maxprintstring=-1
[info] Set current project to sbt-test (in build file:/home/apm/tmp/sbt-test/)
> console
[info] Starting scala interpreter...
[info] 
Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_111).
Type in expressions for evaluation. Or try :help.

scala> ...

scala> Future(42)
...

scala> $intp.isettings.max
maxAutoprintCompletion   maxPrintString

scala> $intp.isettings.maxPrintString = 1000
$intp.isettings.maxPrintString: Int = 1000

scala> "hi"*1000
res0: String = hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihi...

scala> Future(42)
res1: scala.concurrent.Future[Int] = Future(Success(42))

maxPrintString设置为零并不会截断所有内容,包括省略号,这总是残留的,这是一种错误。

答案 1 :(得分:1)

我没有意识到这样做的sbt选项。由于缺乏更好的解决方案,您可以将所有设置隐藏在漂亮的导入中,如下所示:

object console {
  object setup {
    val bar = foo.bar
    bar.init()
  }
}

修改1:

请注意,这相当于您编写的代码原始代码:它在名为bar的范围内放置了一个东西,它指向foo.bar。您还可以使用与类型相同的技术将所需的任何导入分组到一个类型中。这是使用Predef在范围内神奇地获取scala.collection.immutable.Set(类型和值)的机制。

编辑2:

  

我猜你的技术无法通过一次导入实现。

它仍然有效。假设Session定义如下:

trait Session {
  val v
  def f
  lazy val l
  object o {}
  type T
}

然后

val $session = new foo.bar.Session()
import $session._

变为

object console {
  object setup {
    val $session = new foo.bar.Session()

    val v      = $session.v
    def f      = $session.f
    lazy val l = $session.l
    val o      = $session.o
    type T     = $session.T
  }
}

您可以递归地为lib._以及您拥有的任何其他导入应用此转换,直到您构建完全相同的范围。