我正在我的项目中创建一个专门的构建任务,该任务需要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中打开项目时,它都会挂起,等待我在标准输入中输入版本输入。如何进行任务,使其主体仅在任务运行时执行,而不是在构建初始化时执行
答案 0 :(得分:0)
我会考虑定义一个新的自定义任务[http://www.scala-sbt.org/0.12.2/docs/Getting-Started/Custom-Settings.html#implementing-a-task],而不是使用阻止命令(如用户输入)扩展build
。正如您经历的build
经常被执行。
例如,您可以扩展build
以使用预定义值,从环境设置中读取。并且有一个interactiveBuild
任务,您可以在其中提示用户,显示从env变量中检索到的默认值。
有关定义自定义任务的详细信息,请查看以下内容: