Analysis
タスクから返されたオブジェクトから直接この情報を取得することはできないと思いますcompile
。
ただし、できることはanalysis.relations.allProducts
、変更を確認することです。いずれかのファイルが変更された場合、バイトコード変換を実行するタスクを実行できます。
FileFunction.cachedの修正版を使用して、変更を確認できます。
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)
}
}
}
この関数は次のパラメータを取ります。
cacheBaseDirectory
- キャッシュの場所
inStyle
- 変更を検出する方法の説明 (可能なオプションについてはsbt.FilesInfoを参照)
action
- ファイルが変更されたときに実行される関数。この関数は、変更されたファイルのリストを引数として受け取ります。
この関数は、引数として渡されたファイルのセットが変更された場合にのみ実行される別の関数を返します。
例
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)