在SBT中从sbt.package.File转换为java.io.File

时间:2012-07-16 13:20:24

标签: scala sbt sbt-android-plugin

我正在努力扩展Jan Berkel针对SBT的Android插件。

现在,我想知道,如何将sbt.SettingKey[sbt.package.File]转换为java.io.File?有没有办法从java.io.File中提取sbt.SettingKey[sbt.package.File]

例如:

我有一个功能:

def isUpToDate(input: java.io.File): Boolean

期望java.io.File作为参数。

我有一个sbt.SettingKey[sbt.package.File](名为myFileKey),它映射到我需要的File

如何使用映射到isUpToDate的文件调用myFileKey

2 个答案:

答案 0 :(得分:1)

您需要使用<<= 撰写依赖项,使用设置密钥的apply方法解压缩文件。 E.g。

yourKey <<= fileKey { file => ... }

的缩写
yourKey <<= fileKey.apply { file => ... }

请参阅sbt getting-started-guide

中的“根据其他键计算值”部分

另请注意,sbt.File仅是java.io.File的类型别名。


例如,映射一些文件:

val yourKey  = SettingKey[File]("yourKey", "Description")
val settings = Seq[Setting[_]](
  // ....
  yourKey <<= fileKey { f => f / "subdirectory" }
)

答案 1 :(得分:1)

关于更新的问题。我仍然假设您正在修改现有的sbt插件。因此,您仍需要引入依赖关系。设置密钥的值仅在构建过程的特定阶段处变为有效。因此,要检索该值,您需要依赖设置键。

请阅读.sbt Build Definition document中的“任务键”部分,以决定是否需要依赖普通设置键(静态)或其他任务(动态)的结果。它看起来好像你的isUpToDate可能需要一遍又一遍地重新评估。因此,您需要一项任务。

val isUpToDate = TaskKey[Boolean]("isUpToDate", "Description")
val settings = Seq[Setting[_]](
// ....
   isUpToDate <<= fileKey.map(checkUpToDate)
)

private def checkUpToDate(f: File): Boolean = { ... }

注意您需要map而不是apply才能从设置键构建任务。