1

Scala コンパイラの最後の実行によって生成されたクラス ファイルのリストを必要とする SBT 用のプラグインを作成しています。

このクラス ファイルのリストは、バイトコード変換を実行するプログラムに渡されます。この変換プロセスは遅くなる可能性があるため、出力ディレクトリ内のすべてのクラス ファイルではなく、Scala コンパイラの最後の実行によって書き込まれたクラス ファイル (つまり、そこで変更されたもの) のみが必要です。

compileタスクによって最後に生成されたファイルのリストを取得するにはどうすればよいですか?

4

1 に答える 1

3

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)
于 2014-05-26T18:47:13.040 に答える