如何使用Def.app和KList映射任务的依赖项

时间:2014-01-06 13:09:05

标签: scala sbt

这个问题涉及sbt 0.13在this commit时对KLists的实施。我想复制this behaviour,由于KList实现发生了变化,它不再起作用了。

目前的原因是,如果你在元组中对它们进行分组,sbt只允许最多11个依赖项。我听说有什么性能影响为什么它不允许更多,所以我正在寻找替代使用元组并在其上调用RichTaskables.map,我正在考虑使用KLists作为替代方案。< / p>

编辑:以前我想知道如何将klist转换为KL[M[_]]Def.app所期望的AList.klist类型的内容(后者是前任的)。然后我意识到可以通过

将KList实例转换为KL[M[_]]形式的类型构造函数
  • 明确地写出这样一种类型的构造函数,它在更高的类型上进行抽象,M(正如Mark Harrah在答案中指出的那样),或者
  • (我相信)直接访问相关的klist kl.Transform的{​​{1}}类型。

我已经开始使用kl了,如果所有依赖项都是设置或任务,它就可以工作,但如果它们是混合的,它就不能直接编译。

有了这些信息,我的问题仍然存在:

我怎样才能写一些SettingKey&amp; TaskKey依赖关系作为KList并使用Def.app来映射它们的值?我提到kl.Transform因为缺乏更好,更高级别的方法。

2 个答案:

答案 0 :(得分:1)

我已经找到了一种方式让它发挥作用,但我觉得它应该比这更优雅。回到我想要复制的示例,具有相同行为的新代码如下所示:

lazy val yodawg = TaskKey[String]("yo-dawg", "I heard you liked settings, so I put a setting in your setting")

val kl = moduleName :^: version :^: isSnapshot :^: KNil

yodawg <<= Def.app(kl: kl.type#Transform[Def.Initialize]) {
  case a :^: b :^: c :^: KNil => task(List(a, b, c).mkString("~"))
}(AList.klist)

可是:

  • 我必须明确传递AList.klist(可能是预期的,它似乎没有被定义为隐含的任何地方)
  • 我必须将klist保存在val中,并访问其Transform内部类型,这应该是klist的实现细节。另外,我也被迫使用Def.Initialize实例化它。

或者我可以在方括号中提供类型,但它看起来像:

Def.app[kl.type#Transform, Task[String]](kl) { ... }
//                         ^~~~~~~~~~~~

因为我必须提供我正在定义的这个设置的内部类型。

答案 1 :(得分:1)

Def.appAList和相关代码绝对不能手动使用。用例是什么?

要回答这个问题,您正在寻找的类似klist的类型构造函数是:

type KSS[M[_]] = KCons[String, KCons[String, KNil, M], M]

与原始KList一样,它抽象应用于每个元素的类型构造函数M。特别是,它不应该已经应用于示例中的SettingKey之类的类型构造函数。