这个问题涉及sbt
0.13在this commit时对KLists的实施。我想复制this behaviour,由于KList实现发生了变化,它不再起作用了。
目前的原因是,如果你在元组中对它们进行分组,sbt只允许最多11个依赖项。我听说有什么性能影响为什么它不允许更多,所以我正在寻找替代使用元组并在其上调用RichTaskables.map
,我正在考虑使用KLists作为替代方案。< / p>
编辑:以前我想知道如何将klist转换为KL[M[_]]
和Def.app
所期望的AList.klist
类型的内容(后者是前任的)。然后我意识到可以通过
KL[M[_]]
形式的类型构造函数
M
(正如Mark Harrah在答案中指出的那样),或者kl.Transform
的{{1}}类型。我已经开始使用kl
了,如果所有依赖项都是设置或任务,它就可以工作,但如果它们是混合的,它就不能直接编译。
有了这些信息,我的问题仍然存在:
我怎样才能写一些SettingKey&amp; TaskKey依赖关系作为KList并使用Def.app来映射它们的值?我提到kl.Transform
因为缺乏更好,更高级别的方法。
答案 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
(可能是预期的,它似乎没有被定义为隐含的任何地方)Transform
内部类型,这应该是klist的实现细节。另外,我也被迫使用Def.Initialize
实例化它。或者我可以在方括号中提供类型,但它看起来像:
Def.app[kl.type#Transform, Task[String]](kl) { ... }
// ^~~~~~~~~~~~
因为我必须提供我正在定义的这个设置的内部类型。
答案 1 :(得分:1)
Def.app
,AList
和相关代码绝对不能手动使用。用例是什么?
要回答这个问题,您正在寻找的类似klist的类型构造函数是:
type KSS[M[_]] = KCons[String, KCons[String, KNil, M], M]
与原始KList一样,它抽象应用于每个元素的类型构造函数M
。特别是,它不应该已经应用于示例中的SettingKey
之类的类型构造函数。