如何重新定义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
这正是我想要的,而且风格稍微好一些。
答案 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}