【问题标题】:Running Wget in scala build.sbt在 scala build.sbt 中运行 Wget
【发布时间】:2017-07-25 21:43:34
【问题描述】:

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

我对如何在build.sbt 中执行此操作有些困惑。翻阅了 sbt 文档,我找到了 processbuilder。考虑到这一点,我想出了下面的代码。

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

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

如何做到这一点?

【问题讨论】:

    标签: scala sbt


    【解决方案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任务依赖于sbt中的一些其他任务(或者你可以把它们看作事件)。

    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

    【讨论】:

    • 我应该把这段代码sn-p放在哪里? build.sbt 本身内部?因为它会导致我上面提到的相同错误。我希望它在每次调用 sbt 时运行,因为它将所有 jars 添加到类路径
    • @GreedyCoder 你确定每次运行sbt都需要下载吗?无论如何,请参阅我的更新
    • 谢谢。我考虑了一下,我认为这是一个单独的任务,而不是每次都运行:)
    猜你喜欢
    • 2020-11-17
    • 2016-10-16
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多