【问题标题】:Developing task to synchronize managed dependencies with another directory in SBT?开发任务以将托管依赖项与 SBT 中的另一个目录同步?
【发布时间】:2014-03-14 07:55:00
【问题描述】:

我正在尝试编写一个任务来检索依赖项 jar 并将它们放在项目根目录的单个目录中。到目前为止,这是我所拥有的:

retrieveManaged := true

val libDir = settingKey[File]("the directory to retrieve dependency libraries to")

lazy val getLibs = taskKey[Unit]("retrieves all dependency libraries to the libDir")

libDir := baseDirectory.value / "libs"

getLibs := {
  val a = update.value
  sbt.IO.delete(libDir.value)
  for (src <- (managedDirectory.value ** "*.jar").get) {
    sbt.IO.copyFile(src, libDir.value / src.getName, true)
  }
}

我使用retrieveManaged := true,以便sbt 将依赖项复制到managedDirectory。然后我将这些库复制到我定义的目录中。我的问题是:

  1. 我希望我的任务依赖于update 任务,以确保首先将依赖项复制到managedDirectory。如果我理解How can I call another task from my SBT task?,我应该可以通过调用update.value 来做到这一点。但这似乎不起作用。

  2. 我真的很想“同步”,而不是复制文件。这意味着只应复制新添加的文件,而应删除不再存在的任何文件。我该怎么做?

更新

感谢 Jacek 的建议,我能够提出以下解决方案,解决 #1。我仍然需要弄清楚如何做#2(同步而不是复制)。

getLibs := {
  sbt.IO.delete(libDir.value)
  val depFiles = update.value.matching((s: String) => Set("compile", "runtime") contains s)
  for (depFile <- depFiles) {
    sbt.IO.copyFile(depFile, libDir.value / depFile.getName, true)
  }
}

【问题讨论】:

    标签: sbt


    【解决方案1】:

    我认为答案是真的使用update任务的值并解析其结果。这样就可以解决问题 1 和 2。如果没有,请将症状附加到您的问题中。

    所有val a = update.value 都会执行update 任务并将其值分配给a。由于您根本不使用a,因此您丢失了update 为您提供的所有先前信息。要查看它是什么,请在 shell 中执行 show update

    [triggeredby]> help update
    Resolves and optionally retrieves dependencies, producing a report.
    
    [triggeredby]> show update
    [info] Updating {file:/Users/jacek/sandbox/so/triggeredby/}triggeredby...
    [info] Resolving org.fusesource.jansi#jansi;1.4 ...
    [info] Done updating.
    [info] Update report:
    [info]  Resolve time: 2152 ms, Download time: 114 ms, Download size: 0 bytes
    [info]  compile:
    [info]      org.scala-lang:scala-library:2.10.3 (): (Artifact(scala-library,jar,jar,None,List(),None,Map()),/Users/jacek/.sbt/boot/scala-2.10.3/lib/scala-library.jar)
    [info]  runtime:
    [info]      org.scala-lang:scala-library:2.10.3 (): (Artifact(scala-library,jar,jar,None,List(),None,Map()),/Users/jacek/.sbt/boot/scala-2.10.3/lib/scala-library.jar)
    [info]  test:
    [info]      org.scala-lang:scala-library:2.10.3 (): (Artifact(scala-library,jar,jar,None,List(),None,Map()),/Users/jacek/.sbt/boot/scala-2.10.3/lib/scala-library.jar)
    [info]  provided:
    [info]  optional:
    [info]  compile-internal:
    [info]      org.scala-lang:scala-library:2.10.3 (): (Artifact(scala-library,jar,jar,None,List(),None,Map()),/Users/jacek/.sbt/boot/scala-2.10.3/lib/scala-library.jar)
    [info]  runtime-internal:
    [info]      org.scala-lang:scala-library:2.10.3 (): (Artifact(scala-library,jar,jar,None,List(),None,Map()),/Users/jacek/.sbt/boot/scala-2.10.3/lib/scala-library.jar)
    [info]  test-internal:
    [info]      org.scala-lang:scala-library:2.10.3 (): (Artifact(scala-library,jar,jar,None,List(),None,Map()),/Users/jacek/.sbt/boot/scala-2.10.3/lib/scala-library.jar)
    [info]  plugin:
    [info]  sources:
    [info]  docs:
    [info]  pom:
    [info]  scala-tool:
    [info]      org.scala-lang:scala-compiler:2.10.3: (Artifact(scala-compiler,jar,jar,None,List(),None,Map()),/Users/jacek/.sbt/boot/scala-2.10.3/lib/scala-compiler.jar)
    [info]      org.scala-lang:scala-library:2.10.3 (): (Artifact(scala-library,jar,jar,None,List(),None,Map()),/Users/jacek/.sbt/boot/scala-2.10.3/lib/scala-library.jar)
    [info]      org.scala-lang:scala-reflect:2.10.3 (): (Artifact(scala-reflect,jar,jar,None,List(),None,Map()),/Users/jacek/.sbt/boot/scala-2.10.3/lib/scala-reflect.jar)
    [info]      org.scala-lang:jline:2.10.3: (Artifact(jline,jar,jar,None,List(),None,Map()),/Users/jacek/.sbt/boot/scala-2.10.3/lib/jline.jar)
    [info]      org.fusesource.jansi:jansi:1.4: (Artifact(jansi,jar,jar,None,ArraySeq(master),None,Map()),/Users/jacek/.ivy2/cache/org.fusesource.jansi/jansi/jars/jansi-1.4.jar)
    [success] Total time: 3 s, completed Mar 14, 2014 12:16:26 AM
    

    我认为这正是您所需要的 - 使用返回值来满足您的需求。

    【讨论】:

    • 好吧,我是个小菜鸟。我真的不明白那是什么意思。关于#1,我所知道的是我希望在我的任务执行之前发生“更新”。我根本看不出您的建议如何解决 #2。
    • 也许我误解了什么。我对“更新”的理解是它检索声明的依赖项并将它们复制到 managedDirectory。我希望在我的任务发生之前发生“更新”,因为我依赖于它产生的副作用,而不是它可能返回的任何值。
    • 查看help update 的另一个更新。它确实有副作用 - 检索声明的 deps,但这是一个副作用,对吧?任务的输出是什么——它做了什么的报告,我相信这就是你需要的。
    • 感谢 Jacek,我查看了 API,包括 UpdateReport/RichUpdateReport,现在我明白了检索依赖项需要做什么。但我仍然不知道如何“同步”(在我的问题中描述的意义上)。我目前正在做一个在语义上有点不同的“复制”。
    猜你喜欢
    • 2020-05-15
    • 2018-05-05
    • 2021-09-30
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2014-08-27
    • 2018-03-20
    • 2014-02-23
    相关资源
    最近更新 更多