概要
Gradleのタスク動的定義を試したのでメモ。
今回はSubversionのリポジトリ上のフォルダに対応するタスクを定義してみる。
やり方
タスクの動的生成
Gradle日本語ドキュメントを参考に次のメソッドを作ってみたので抜粋。
指定した名前のタスクを定義してくれる。
build.gradle
// タスクを定義
void createTask( List taskNames ) {
for( String name : taskNames ) {
task "${name}" << {
println "task[${name}]"
}
}
}
SVNのフォルダ名取得
SVNのフォルダ名を取ってくるメソッドを作成。
SVN操作にはSVNKitを使用。
以下抜粋。
build.gradle
// リポジトリ上に存在するフォルダ名リストを取得
List getSVNList( String repoUrl,
String userName,
String password ) {
def manager = SVNClientManager.newInstance(
SVNWCUtil.createDefaultOptions(true),
userName,
password)
def client = manager.getLogClient();
def dirList = new ArrayList<String>();
def dirHandler = new ISVNDirEntryHandler() {
public void handleDirEntry(SVNDirEntry dirEntry) {
if(!dirEntry.getName().equals("")) {
dirList.add(dirEntry.getName());
}
}
};
client.doList(
SVNURL.parseURIDecoded(repoUrl),
SVNRevision.HEAD,
SVNRevision.HEAD,
false,
dirHandler );
return dirList;
}
ソース
ソースは次の通り。
build.gradle
import org.tmatesoft.svn.core.*
import org.tmatesoft.svn.core.wc.*
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.tmatesoft.svnkit:svnkit:1.7.8'
}
}
// リポジトリの情報
def svnList = ["url1","url2"]
def userName = "user"
def password = "password"
setup(svnList, userName, password)
// リポジトリ上に存在するフォルダ名に対応するタスクを定義
private void setup( List<String> baseUrlList,
String userName,
String password ) {
for(String baseUrl : baseUrlList) {
createTask(getSVNList(baseUrl, userName, password))
}
}
// リポジトリ上に存在するフォルダ名リストを取得
List getSVNList( String repoUrl,
String userName,
String password ) {
def manager = SVNClientManager.newInstance(
SVNWCUtil.createDefaultOptions(true),
userName,
password)
def client = manager.getLogClient()
def dirList = new ArrayList<String>()
def dirHandler = new ISVNDirEntryHandler() {
public void handleDirEntry(SVNDirEntry dirEntry) {
if(!dirEntry.getName().equals("")) {
dirList.add(dirEntry.getName())
}
}
}
client.doList(
SVNURL.parseURIDecoded(repoUrl),
SVNRevision.HEAD,
SVNRevision.HEAD,
false,
dirHandler )
return dirList
}
// タスクを定義
void createTask( List taskNames ) {
for( String name : taskNames ) {
task "${name}" << {
println "task[${name}]"
}
}
}
まとめ
SVNのフォルダに対応するタスクを動的に定義できた。
リポジトリ上フォルダのZIP圧縮はよくやる作業なので、タスク内で圧縮するようにしたら楽できそう。
あと、Javaは知ってるけどGroovyが全然分かんない。
多分もっと簡潔に書けるんだろうなぁ。