【问题标题】:How to map a task's dependencies using Def.app and a KList如何使用 Def.app 和 KList 映射任务的依赖关系
【发布时间】:2014-01-06 23:31:46
【问题描述】:

这个问题与sbt 0.13 从this commit 开始的 KLists 实现有关。我想复制 this behaviour,因为 KList 实现发生了变化,它不再起作用了。

原因是目前,如果你将它们分组到一个元组中,sbt 最多只允许 11 个依赖项。我听说为什么它不允许更多的性能影响,所以我正在寻找使用元组并在其上调用 RichTaskables.map 的替代方法,并且我正在考虑使用 KLists 作为这种替代方法。

编辑:以前我想知道如何将 klist 转换为 Def.appAList.klist 所期望的 KL[M[_]] 类型(前者需要后者)。然后我意识到一个 KList 实例可以通过

变成KL[M[_]] 形式的类型构造函数
  • 明确编写这样一个类型构造函数,它抽象出更高的类型,M(正如 Mark Harrah 在他的回答中指出的那样),或者
  • (我相信)通过直接访问有问题的 klist klkl.Transform 类型。

我尝试过使用kl.Transform,如果所有依赖项都是设置或任务,它就可以工作,但如果它们混合在一起,它就不会直接编译。

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

如何将一些 SettingKey 和 TaskKey 依赖项编写为 KList 并使用 Def.app 映射它们的值?我提到 Def.app 是因为我不知道更好、更高级的方法.

【问题讨论】:

    标签: scala sbt


    【解决方案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) { ... }
    //                         ^~~~~~~~~~~~
    

    就像我必须提供我正在定义的这个设置的内部类型一样。

    【讨论】:

    • 您能否批准答案或更新问题以使其更具体(如果需要,可能会创建其他问题)?
    • 这种方法还是有问题的。一方面,当混合TaskKeySettingKey 依赖项时,我无法编译它。我将编辑问题以删除/解释不清楚的地方。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 感谢您的回答!我想依赖超过 11 种设置,而使用元组是不可能的(我知道允许这样做会使 sbt 编译速度变慢),而这个 KList 解决方案是我听到的唯一一个被讨论的解决方案。据我所知,您描述的KSSmyKList.Transform 相同,这是我一直在尝试使用的。但是,当我混合使用 SettingKeyTaskKey 依赖项时,我发现这是有问题的。
    • 使用:= 的标准语法适用于任意数量的输入。为了混合SettingKey/TaskKey 输入,需要将SettingKeys 提升为Tasks。标准语法在幕后为您执行此操作。
    • 好的。我一直在努力避免这种情况(仅仅是因为它破坏了 IntelliJ 中的突出显示),但这样做反而变得过于复杂,以至于不值得。另外,出于好奇,是否有类似 .value 的宏适用于 Def.Initialize 事物? (如果我不想将它们分配给设置,而只是直接使用它们的值)
    • 是的,完全正确。我想我只需要等待他们最终修复它。 (可能要等很久)
    • 好的,如果有办法投票,如果您还没有投票,请务必投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2017-10-29
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    相关资源
    最近更新 更多