可以写一些类似
的内容(managedClasspath in Compile).value
获取managedClasspath
配置中Compile
的值。
(managedClasspath in Compile)
的类型又是sbt.TaskKey(因为我们将in
方法称为ConfigKey
)。
value
或SettingKey
上没有TaskKey
方法,我无法找到提供此类方法的任何隐式类。那怎么会存在呢?这是一个神奇的宏观伏都教吗?
答案 0 :(得分:7)
两者都有,工作组件有一些东西:
*XYZKey[_]
都可以通过隐式转换为适当的Initialize[_]
实例。默认情况下,这是一个初始化程序,它读取键上的现有值并将其返回。sbt.std.MacroValue[T]
类型是一个仅限编译时的类,它包含可以在其上调用.value的内容:http://www.scala-sbt.org/0.13.5/api/index.html#sbt.std.MacroValue。我们使用它来跟踪宏中的底层实例,并表示它们具有特殊意义(即我们必须重新编写代码,以便在使用之前等待值存在)。sbt.Def
对象有一组名为macroValueXYZ
的隐含词,可将Initialize[_]
个实例提升到宏API中。所以,正如你所看到的那样,通过我们的内部实现它是一种黑魔法。我们必须研究一种在scaladoc工具中更好地记录API的方法。