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

时间:2014-08-11 15:29:06

标签: scala sbt

可以写一些类似

的内容
(managedClasspath in Compile).value

获取managedClasspath配置中Compile的值。

(managedClasspath in Compile)的类型又是sbt.TaskKey(因为我们将in方法称为ConfigKey)。

valueSettingKey上没有TaskKey方法,我无法找到提供此类方法的任何隐式类。那怎么会存在呢?这是一个神奇的宏观伏都教吗?

1 个答案:

答案 0 :(得分: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对象有一组名为macroValueXYZ的隐含词,可将Initialize[_]个实例提升到宏API中。
  4. 所以,正如你所看到的那样,通过我们的内部实现它是一种黑魔法。我们必须研究一种在scaladoc工具中更好地记录API的方法。