Gradle:フォルダ(ディレクトリ)をまるまるコピーするタスク

2018年12月7日

もともとGradleにはCopyタスクというのがあるが、これが非常に使いづらくわかりづらいので、antを使用したコピータスクを作成した。フォルダ(ディレクトリ)のみをまるごとコピーするが、コピーしないパターン、コピーするパターンも指定できる。

// フォルダまるごとをコピーするタスク
// 
// task copyit(type: CloneDir) {
//   src = 'srcFolder'
//   dst = 'dstFolder'
// } 
// 含めるパターンがあれば、includesを指定する。省略時はすべて含まれるものとする。
// task copyit(type: CloneDir) {
//   src = 'srcFolder'
//   dst = 'dstFolder'
//   includes = ['**/.*']
// } 
// 除外パターンがあれば、excludesを指定する
// task copyit(type: CloneDir) {
//   src = 'srcFolder'
//   dst = 'dstFolder'
//   excludes = ['**/.*']
// } 
class CloneDir extends DefaultTask {
  String src;
  String dst;

  /* antのfilesetの除外パターン。省略時は何も除外されない */
  List excludes = []

  /* antのfilesetの包含パターン。省略時はすべてを包含する */
  List includes;

  @TaskAction
  def duplicate() {
    getProject().ant {
      delete dir:dst
      copy(todir:dst) {
        fileset(dir: src) {
          excludes.each { exclude(name:it) }
          if (includes != null) {
            includes.each { include(name:it) }
          }
        }
      }
    }
  }
}

// このタスク定義をbuild.gradle以外に置く場合は以下が必要
ext.CloneDir = CloneDir

使い方は簡単だ。例えば以下のようにする。コピー前にfolder2は削除されるので不要なファイルが残ることはない。

以下の例では、ドットから始まるファイル名はコピーしない。

task copyit(type: CloneDir) {
  src = "folder1";
  dst = "folder2";
  excludes=['**/.*']
}