我正在维护一些类似于这种双层解决方法的代码:
import AssemblyKeys._
lazy val assemblySettings: Seq[sbt.Project.Setting[_]] = baseAssemblySettings
implicit def wrapTaskKey[T](key: TaskKey[T]): WrappedTaskKey[T] = WrappedTaskKey(key)
case class WrappedTaskKey[A](key: TaskKey[A]) {
def orr[T >: A](rhs: Initialize[Task[T]]): Initialize[Task[T]] =
(key.? zipWith rhs)( (x,y) => (x :^: y :^: KNil) map Scoped.hf2( _ getOrElse _ ))
}
lazy val baseAssemblySettings: Seq[sbt.Project.Setting[_]] = Seq(
test <<= test orr (test in Test).identity,
test in assembly <<= (test in Test).identity,
)
(来自here)。
我应该如何完全删除此变通办法的两个“层”,因为在sbt&gt; = 0.12中显然不再需要它们了?
答案 0 :(得分:2)
我甚至不确定是否仍然需要。
不再需要了。
or
是#202 (Task-scoped keys)的解决方法,适用于sbt 0.10。这个但是根据评论在sbt 0.12修复了。让我们在sbt 0.13中测试一下:
helloworld> set test in Compile in compile := {}
[info] Defining helloworld/compile:compile::test
helloworld> inspect test
[info] Task: Unit
[info] Description:
[info] Executes all tests.
[info] Provided by:
[info] {file:/Users/eed3si9n/work/helloworld/}helloworld/test:test
....
所以我们明白#202。事实上,我上周(2013年9月28日)将sbt-assembly中的or
重新布线为0.10.0,现在它看起来像这样:
// test
test in assembly := (test in Test).value,
orr
是#204 ("Reference to undefined setting" while using an optional key)的解决方法,它在sbt 0.11.0中打破or
并根据标记修复为0.11.1。由于我们不再需要or
,这有点没有实际意义,但在sbt 0.11.1之后我们不需要orr
。
为避免进一步混淆,我从非官方指南中删除了该部分,并链接到github以获取历史兴趣。
答案 1 :(得分:0)
查看sbt-assembly的日志,只需删除wrapTaskKey
和WrappedTaskKey
并将orr
替换为or
即可。
我不确定即使or
仍然是必要的。但我根本不理解这段代码。