SBT读取STDIN以获取用户输入

时间:2016-10-02 23:19:27

标签: scala build sbt

我正在我的项目中创建一个专门的构建任务,该任务需要STDIN中的用户输入,这将允许用户选择将使用哪个版本的hadoop,spark等库来构建应用程序。

到目前为止,我已经创建了一个如下所示的任务。

lazy val build = SettingKey[Unit]("build", "build the app with all dependencies") in all // all is a project key

build := {
    println(s"input hadoop client version")
    val hadoop = scala.io.Source.fromInputStream(System.in).bufferedReader().readLine
    println(s"input hiveserver jdbc version")
    val hiveserver = scala.io.Source.fromInputStream(System.in).bufferedReader().readLine
    // bunch of code to customize the build
}

上述代码的问题在于,无论何时在sbt中或在运行build任务时初始化项目,都会运行reload任务键的主体。因此每当我在sbt中打开项目时,它都会挂起,等待我在标准输入中输入版本输入。如何进行任务,使其主体仅在任务运行时执行,而不是在构建初始化时执行

1 个答案:

答案 0 :(得分:0)

我会考虑定义一个新的自定义任务[http://www.scala-sbt.org/0.12.2/docs/Getting-Started/Custom-Settings.html#implementing-a-task],而不是使用阻止命令(如用户输入)扩展build。正如您经历的build经常被执行。 例如,您可以扩展build以使用预定义值,从环境设置中读取。并且有一个interactiveBuild任务,您可以在其中提示用户,显示从env变量中检索到的默认值。 有关定义自定义任务的详细信息,请查看以下内容: