我有一个要求,我需要从URL下载一堆jar,然后将它们放在lib目录中,然后将它们添加到非托管依赖项。
我很想知道如何在build.sbt
中执行此操作。找了sbt文档,我找到了processbuilder。考虑到这一点,我提出了以下代码。
for(i <- jarUrls) {
val wget = s"wget -P $libDir $anonUser@$hgRootURL/$i"
wget !
}
这会在一堆罐子上运行wget
,然后将文件放在上面提到的文件夹中。非常简单的代码,但我无法运行它。我得到的错误是“类型Unit
的表达式必须在SBT文件中向DslEntry
确认”。
如何做到这一点?
答案 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.sbt
:http://www.scala-sbt.org/0.13/docs/Full-Def.html