如何在SettingKey或TaskKey上调用.value?

fom*_*mil 5 scala sbt

人们可以写出类似的东西

(managedClasspath in Compile).value
Run Code Online (Sandbox Code Playgroud)

获得的值managedClasspath中的Compile配置.

类型(managedClasspath in Compile)再次是sbt.TaskKey(因为我们in用a 调用方法ConfigKey).

然而value,SettingKey或者没有方法TaskKey,我找不到任何提供这种方法的隐式类.那怎么会存在呢?这是一个神奇的宏伏都教吗?

jsu*_*eth 7

这两个,工作组件有一些东西:

  1. 在sbt中,任何*XYZKey[_]都可以Initialize[_]通过隐式转换为适当的实例.默认情况下,这是一个初始化程序,它读取键上的现有值并返回它.
  2. sbt.std.MacroValue[T]类型是一个编译时的唯一一类持有的东西,可以有.value的调用它: http://www.scala-sbt.org/0.13.5/api/index.html#sbt.std.MacroValue.我们使用它来跟踪宏中的底层实例,并表示它们具有特殊意义(即我们必须重新编写代码,以便在使用之前等待值存在).
  3. sbt.Def对象具有一组implicits,称为macroValueXYZInitialize[_]实例提升到宏API中.

所以,正如你所看到的,通过我们的内部实现它是一种黑魔法.我们必须研究一种在scaladoc工具中更好地记录API的方法.