scala - SBT plugin: Cómo listar archivos generados por compilación incremental
plugins incremental-compiler (1)
Creo que no puede obtener esta información directamente del objeto Analysis
devuelto por la tarea de compile
.
Sin embargo, lo que podría hacer es verificar las relaciones de analysis.relations.allProducts
para los cambios. Si alguno de los archivos se modifica, puede ejecutar su tarea, que realiza transformaciones de código de bytes.
Puede usar una versión modificada de FileFunction.cached para verificar los cambios.
def cached(cacheBaseDirectory: File, inStyle: FilesInfo.Style)(action: Set[File] => Unit): Set[File] => Unit = {
import Path._
lazy val inCache = Difference.inputs(cacheBaseDirectory / "in-cache", inStyle)
inputs => {
inCache(inputs) { inReport =>
if(!inReport.modified.isEmpty) action(inReport.modified)
}
}
}
La función toma los siguientes parámetros:
-
cacheBaseDirectory
- ubicación de la memoria caché -
inStyle
: descripción de cómo deben descubrirse los cambios (consulte sbt.FilesInfo para conocer las posibles opciones) -
action
- una función ejecutar, cuando los archivos han sido modificados. La función toma una lista de archivos modificados como un argumento.
La función devuelve otra función que se ejecuta solo si se modifica el conjunto de archivos que se le pasan como un argumento.
Ejemplo
val transformBytecode = taskKey[Unit]("Transforms bytecode of modified files")
def cached(cacheBaseDirectory: File, inStyle: FilesInfo.Style)(action: Set[File] => Unit): Set[File] => Unit = {
import Path._
lazy val inCache = Difference.inputs(cacheBaseDirectory / "in-cache", inStyle)
inputs => {
inCache(inputs) { inReport =>
if(!inReport.modified.isEmpty) action(inReport.modified)
}
}
}
transformBytecode <<= Def.task {
val analysis = (compile in Compile).value
val cachedFunction = cached(streams.value.cacheDirectory / "transform-bytecode", FilesInfo.lastModified) { modified =>
// here you want to run the bytecode transformations on `modified` files
println(s"Modified files $modified")
}
cachedFunction(analysis.relations.allProducts.toSet)
}.triggeredBy(compile in Compile)
Estoy escribiendo un complemento para SBT que requiere una lista de los archivos de clase generados por la última ejecución del compilador de Scala.
Esta lista de archivos de clase se pasa luego a un programa que realiza algunas transformaciones de código de bytes. Como este proceso de transformación puede ser lento, solo quiero los archivos de clase escritos por la última ejecución del compilador de Scala (es decir, los que allí se modificaron), no todos los archivos de clase en el directorio de salida.
¿Cómo puedo obtener una lista de los archivos generados por última vez por la tarea de compile
?