【发布时间】: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 上发布了这个问题 ;-)