Gradle のビルドスクリプトで Copy
型のタスクを定義すると、ファイルのコピーや移動を簡単に行うことができます。
ファイルコピーの基本
次の hello
タスクは、ディレクトリ from/dir
以下のファイルを再帰的にコピーします。
from/dir
以下のディレクトリ階層は保たれます。
コピー先のディレクトリ to/dir
が存在しない場合は、自動的に作成されます。
task hello(type: Copy) {
from 'from/dir'
into 'to/dir'
}
コピーする対象を絞り込む
Copy
タスクにおいて、include
や exclude
でファイル名のパターンを指定することで、コピーするファイルを絞り込むことができます。
task hello(type: Copy) {
from 'from/dir'
into 'to/dir'
include '**/*.txt'
}
task hello(type: Copy) {
from 'from/dir'
into 'to/dir'
exclude '**/*.bk'
}
複数のディレクトリからファイルをコピーする
コピー元のディレクトリを複数指定して、一つのディレクトリにコピーすることもできます。
下記の例では、from1
ディレクトリと from2
ディレクトリ内のファイルを to
ディレクトリにコピーしています。
task hello(type: Copy) {
from 'from1'
from 'from2'
into 'to'
}
ただし、この方法だと、複数のコピー元に同じファイル名のファイルがあると、ファイルが上書きコピーされてしまいます(ツリー構造が異なれば大丈夫です)。
下記のようにすると、コピー先にディレクトリを作って、その中にファイルをコピーすることができます。
from
のパラメータを括弧で囲むことに注意してください。
task hello(type: Copy) {
from('from1') {
into 'f1'
}
from('from2') {
into 'f2'
}
into 'to'
}
このようにすると、from1
ディレクトリ内のファイルは to/f1
に、from2
ディレクトリ内のファイルは to/f2
に、それぞれコピーされるようになります。
ファイルをリネームする
Copy
型のタスクでファイルをコピーする際に、rename
メソッドを使用するとファイル名を変更することができます。
task hello(type: Copy) {
from 'from'
into 'to'
rename(/(.+)\.txt$/, '$1.html')
}
拡張子として .txt
を持たないファイルに関しては、元のファイル名のままコピーされます。
上記では rename
メソッド呼び出しのパラメータとして置換パターンを指定していますが、クロージャの形で置換処理を記述することもできます。
task hello(type: Copy) {
from 'from'
into 'to'
rename { it - ~/\.txt$/ + '.html' }
}
上記の例では、それぞれのファイル名に対して、末尾から .txt
を削除し、.html
を付加するという処理を行っています。
末尾に .txt
がないファイルに対しても、.html
を付加してしまうことに注意してください。