如何重新定义SBT中的密钥?

时间:2014-04-16 00:50:03

标签: scala key sbt

如何重新定义SBT中的密钥(而不是扩展或定义)?

我目前在构建脚本(project / build.scala)中有以下内容:

fullClasspath in Runtime <<= (fullClasspath in Runtime, classDirectory in Compile) map { (cp, classes) => (cp.files map {
  f: File =>
    if (f.getName == classes.getName) {
      val result = new File(f.getParent + File.separator + "transformed-" + f.getName)
      if (result.exists) result else f
    } else f
}).classpath }

它在运行时扩展了类路径,为Compile中的每个目录添加一个名称相同但前面加transformed-的新目录。

(如果你想知道为什么,我有一个插件,它在编译之后但在打包之前对字节码执行程序转换,如果你覆盖原始文件,选择性重新编译会非常混乱。)

我的问题如下:这扩展了原始密钥,因此类路径包含来自Compile的原始目录,以及重命名的副本,但我只想要从Compile重命名的目录。

我试图按照

的方式做点什么
fullClasspath in Runtime := ...

但我不知道该放在右侧。


我已经标记了答案,因为它直接引导我解决方案,但我的最终解决方案是将上面的代码段修改为以下

fullClasspath in Runtime := (fullClasspath in Runtime).value.files.map {
  f: File =>
    if (f.getName == (classDirectory in Compile).value.getName) {
      val result = new File(f.getParent + File.separator + "transformed-" + f.getName)
      if (result.exists) result else f
    } else f
}.classpath

这正是我想要的,而且风格稍微好一些。

1 个答案:

答案 0 :(得分:0)

这是我刚刚在sbt命令行做的一个小实验,显示绝对可以删除fullClasspath中不需要的内容:

% sbt
> show runtime:fullClasspath
[info] List(Attributed(.../target/classes),
            Attributed(.../jars/scala-library-2.10.4.jar),
            Attributed(.../jars/asm-all-3.3.1.jar))
> set fullClasspath in Runtime := (fullClasspath in Runtime).value.files.filterNot(_.getName.containsSlice("asm")).classpath
> show runtime:fullClasspath
[info] List(Attributed(.../target/classes),
            Attributed(.../jars/scala-library-2.10.4.jar))

Voila - “asm-all-3.3.1”条目已经消失。

请注意,这不是<<= vs :=。后者只是前者的基于宏观的糖。如果我避开:=并且执行此操作,则实验结果相同:

set fullClasspath in Runtime <<= (fullClasspath in Runtime) map
  {_.files.filterNot(_.getName.containsSlice("asm")).classpath}