【问题标题】:cacheDirectory deprecated in 0.13...so now what?cacheDirectory 在 0.13 中已弃用...那么现在呢?
【发布时间】:2013-08-20 09:28:09
【问题描述】:

在 sbt 邮件列表上问过这个问题,但显然是phased out

我创建了一个project on github,它可以解决“sbt> clean”问题,避免删除工件更新缓存目录。 在 0.12.4 上运行良好,但在 0.13 中损坏,“sbt> update”后我的自定义更新缓存目录为空

相当于:

cacheDirectory <<= baseDirectory / "sbt-no-clean"

在 0.13 中?我看到cacheDirectory 已被弃用,我们将改用streams

0.13 的SBT FAQ 有一个关于使用 FileFunction.cached 的部分,是上面 1 行的替代品吗?看起来不像。

Streams 确实可以完成这项工作,但由于使用 cacheDirectory 的旧方法不再有效——好吧,从技术上讲,属性已设置,但有些东西会覆盖它,所以它更多的是删除而不是弃用功能 - - 我已经换档并尝试使用cleanKeepFiles

cleanKeepFiles <<= (streams) map{s=> Seq(s.cacheDirectory)}

我得到一个返回类型不匹配,一个令人抓狂的,因为我不知道如何转向:

sbt.Def.Initialize[sbt.Task[Seq[java.io.File]]]

进入

sbt.Def.Initialize[Seq[java.io.File]]

赞赏的想法, 谢谢

编辑
如果你使用 apply 而不是 map:

cleanKeepFiles <<= streams.apply{_.map(x=>Seq(x.cacheDirectory))}

然后你得到:

sbt.Task[Seq[java.io.File]]

这似乎越来越近了,但是编译器想要:

Seq[java.io.File]

cleanKeepFiles 的类型为 SettingKey[Seq[File]]

我对如何从流的类型中获取SettingKey[Seq[File]] 感到非常困惑:TaskKey[TaskStreams]

【问题讨论】:

  • 如果您使用新的 0.13 语法,例如 set cleanKeepFiles := Seq(streams.value.cacheDirectory),则错误消息是明确的:error: A setting cannot depend on a task,这似乎表明在类型排列之前这不仅仅是摆弄的问题。希望其他人有进一步的见解。
  • @SethTisue 我确实想出了一个解决方案,但忘了我在 SO 上发布了这个问题 ;-)

标签: caching task sbt updates


【解决方案1】:

完全忘记发布这个问题,幸好解决方案非常简单:

cleanKeepFiles <+= base / pathToCacheDir

这可以防止 SBT 在每次清理时吹走 deps 缓存,从而缩短清理/编译周期几秒钟的时间 - 一个不错且简单的胜利,就像我们能够在 SBT

【讨论】:

  • 您的意思是cleanKeepFiles &lt;+= target / "streams"(和“分辨率缓存”)吗?似乎在build.sbt 为我工作。 ...现在的问题是弄清楚如何在不复制粘贴的情况下将其应用于子项目。
【解决方案2】:

在我的情况下,只需将 cacheDirectory 更改为 target 即可:

来自:

cacheDirectory <<= baseDirectory / "sbt-no-clean"

target <<= baseDirectory / "sbt-no-clean"

【讨论】:

    猜你喜欢
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多