在scala build.sbt中运行Wget

时间:2017-07-25 12:56:46

标签: scala sbt

我有一个要求,我需要从URL下载一堆jar,然后将它们放在lib目录中,然后将它们添加到非托管依赖项。

我很想知道如何在build.sbt中执行此操作。找了sbt文档,我找到了processbuilder。考虑到这一点,我提出了以下代码。

for(i <- jarUrls) {
  val wget = s"wget -P $libDir $anonUser@$hgRootURL/$i"
  wget !
}

这会在一堆罐子上运行wget,然后将文件放在上面提到的文件夹中。非常简单的代码,但我无法运行它。我得到的错误是“类型Unit的表达式必须在SBT文件中向DslEntry确认”。

如何做到这一点?

1 个答案:

答案 0 :(得分:1)

build.sbt不仅仅是scala文件,sbt对其进行了特殊的预处理(这就是为什么你没有def project =等)。

您的问题发生是因为build.sbt中的每行代码(导入和定义除外)必须返回类型DslEntry的表达式,因为sbt将每行代码视为设置。你什么时候想要你的wget被执行?通常的方法是定义Task

lazy val wget = taskKey[Unit]("Wget")

wget := {
  for(i <- List(1,2,3)) {
    val wget = s"wget -P $libDir $anonUser@$hgRootURL/$i"
    wget !
  }
  ()
}

并像sbt wget一样运行。

你也可以在某人的任务中使wget任务依赖于其他任务(或者你可以将其视为事件)。

请参阅http://www.scala-sbt.org/0.13/docs/Tasks.html

当然,有一些棘手的不安全方式,例如:

val init: Unit = {
   //any code you want here
}

但是我不推荐它,因为你可能想要那些文件,比如说compile阶段或者其他东西:

wget := {
  your code here
} dependsOn compile

您还可以使用常规scala构建而不是build.sbthttp://www.scala-sbt.org/0.13/docs/Full-Def.html