Copy タスク
Copy タスクは Gradle の core で提供されている。
簡単な Copy タスク例は以下。
task copyConfig(type: Copy) { from 'config' into 'build/config' }
gradle copyConfig
でタスクを実行すると 'config' ディレクトリにあるファイルを'build/config'ディレクトリにコピーする。
exclude
コピー対象のフィルタリングは Ant 形式の glob パターンで指定できる。
ファイル名に Test という文字が入ったものを除外するには以下のように指定する。
task copyConfig(type: Copy) { from 'config' into 'build/config' exclude '**/*Test*' }
**
とすることで対象ディレクトリに対して再帰的にルールが適用される。
include
Dev という文字が入ったテキストファイルだけをコピーしたい場合は以下のように指定する。
task copyConfig(type: Copy) { from 'configdir' into 'build/configdir' include '**/*Dev*.txt' }
複数指定する場合には include('**/*.txt', '**/*.xml', '**/*.properties')
のように指定することができる。
以下のようにクロージャで複雑な除外設定を表現することもできる。
exclude { details -> details.file.name.endsWith('.html') && details.file.text.contains('staging') }
includeEmptyDirs で空ディレクトリを除外
includeEmptyDirs
で空ディレクトリをコピー対象外に設定できる。
task copyConfig(type: Copy) { from 'configdir' into 'build/configdir' includeEmptyDirs = false }
デフォルトはtrue
で空ディレクトリもコピーされる
複数箇所からのコピー
複数のディレクトリからコピーする例。
task complexCopy(type: Copy) { from ('src/main/templates') { include '**/*.gtpl' } from('i18n') from('config') { exclude 'Development*.groovy' } into 'build/resources' }
対象のディレクトリを from
で並べれば良い。
複数ディレクトリからのコピーでファイルが重複していた場合の動作は duplicatesStrategy
でストラテジを定義する。
task complexCopy(type: Copy) { from 'dir1' from 'dir2' duplicatesStrategy 'exclude' }
include
がデフォルトで、後からコピーされたもので上書きされる。指定することで、重複が発生した場合には警告が出力されるようになる。
exclude
では重複したファイルは無視されます。最初にコピーされたファイルが最終的に使われる。
rename リネームコピー
正規表現でファイル名のリネームができる。
task rename(type: Copy) { from 'source' into 'dest' rename(/file-template-(¥d+)/, 'production-file-$1.txt') }
グループ指定したものを $1
や $2
などで参照してリネーム後のファイル名に利用している。
rename
にクロージャを渡すこともでき、より柔軟な処理を記載できる。
task rename(type: Copy) { from 'source' into 'dest' rename { fileName -> "production-file${(fileName - 'file-template')}" }
Groovy では文字列同時の-
は、最初に見つかった文字列を削除するため、前述の例と同じ動きとなる。
expand で変数の置換
ビルド時に環境毎に設定ファイルを書き換えたい場合など expand() メソッドが使える。
versionId = '1.6' task copyProductionConfig(type: Copy) { from 'source' include 'config.properties' into 'build/war/WEB-INF/config' expand([ databaseHostname: 'db.foo.com', version: versionId, buildNumber: (int) (Math.random() * 1000), date: new Date() ]) }
expand は groovy.text.SimpleTemplateEngine を利用しているので、JSP形式<% %>
<%= %>
または GString形式 ${}
をプレースホルダとして利用できる。
以下のような設定ファイルのプレースフォルダが expand の指定で文字列置換される。
# App configuration file hostname: ${databaseHostname} appVersion: ${version} buildNumber: ${buildNumber} buildDate: ${date.format("yyyyMMdd'T'HHmmssZ")}
fileMatching で変数の置換
前述の例では include
で置換ファイル対象を指定したが、fileMatching
で該当したファイルのみ置換を行うことができる。
task copyFiles(type : Copy) { from 'source' into 'build/war/WEB-INF/config' filesMaching('**/*.properties') { expand version: '1.0' } }
filter で1行毎に変換
コピー対象のファイルを1行ずつ変換処理するには filter
を使う。
以下の例では filter にクロージャを渡してコピー時にファイルの内容を1行毎に変換処理している。
task copyProductionConfig(type: Copy) { from 'source' include 'templ.conf' into 'build' rename { it - 'templ' + 'production'} filter { line -> "[$line]" } }
filter()
には java.io.FilterReader
のサブクラスを渡せるので、ant のフィルタがそのまま使える。
import org.apache.tools.ant.filters.FixCrLfFilter import org.apache.tools.ant.filters.ReplaceTokens import org.apache.tools.ant.filters.TabsToSpaces task copyProductionConfig(type: Copy) { ・・・ filter(FixCrLfFilter) filter(ReplaceTokens, tokens: [copyright: '2009', version: '2.3.1']) filter(TabsToSpaces, tablength: 4) }
改行コードをプラットフォームに応じて変更し、@copyright@
@version@
という文字を変換し、タブをスペースに変換など。
eachFile でファイル毎に処理
filter()
では行単位であったが、eachFile()
はファイル単位で処理する。
task copyFile(type: Copy) { into 'build/deploy' from 'source' eachFile { fileCopyDetails -> println fileCopyDetails.file.name } }
上記ではクロージャを渡している。引数には org.gradle.api.file.FileCopyDetails
が渡される。
CopySpec を定義する
コピーの仕様を定義して with
で適用できる。
def contentSpec = copySpec { from("content") { include "**/*.txt" } } task copy(type: Copy) { into "$buildDir/copy" with contentSpec }
Gradle Effective Implementation Guide
- 作者: Hubert Klein Ikkink
- 出版社/メーカー: Packt Publishing
- 発売日: 2012/10/25
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築
- 作者: 綿引琢磨,須江信洋,林政利,今井勝信
- 出版社/メーカー: 翔泳社
- 発売日: 2014/11/05
- メディア: 大型本
- この商品を含むブログ (2件) を見る