GradleでBuild Init Pluginを使うとプロジェクトのひな形を簡単に作れます。
しかしもって、こいつが役に立つ様で実際には全然ダメなやつなのです、ハイ。
OSのユーザ名がゴリゴリ入ったコメントがあったりとか、無くても動くsettings.gradleが入ってたりとか、すげぇ使い辛い。
俺俺initタスクを定義しよう
という訳で役に立たないinitタスクを上書きします。
しかしもって、そもそもプロジェクトが無い所にプロジェクトを生み出すわけでプラグインって訳にもいきません。
どうするのかというと、Initialization Scriptsという仕組みを使ってデフォルトでプロジェクトに定義されているタスクを上書きします。
雑に説明すると、
- USER_HOME/.gradle/init.gradle
- 初期化スクリプトが1つだけの場合に使う
- USER_HOME/.gradle/init.d/*.gradle
- ディレクトリの中に拡張子が
.gradle
なファイルを雑に放り込みたい時に使う - ファイル名順に処理される
- ディレクトリの中に拡張子が
辺りにファイルを配置しておくとGradleが実行してくれますよって話です。
という訳で、こんなスクリプトを書いて、USER_HOME/.gradle/init.d/newproject.gradleとして保存します。
def root = file("templates").getAbsolutePath()
allprojects {
if(parent != null) {
return
}
def copyTo = { src, dest ->
def p = rootProject.file(dest)
p.parentFile.mkdirs()
p.text = file("${root}/${src}").text
}
def cp = { copyTo(it, it) }
task settings << {
def jdt_ui = 'org.eclipse.jdt.ui.prefs'
copyTo(jdt_ui, ".settings/${jdt_ui}")
}
task init(dependsOn: ["wrapper", "settings"]) << {
["main", "test"].each {
rootProject.file("src/${it}/java").mkdirs()
rootProject.file("src/${it}/resources").mkdirs()
}
file("gradle.properties").text = ""
cp(".gitignore")
cp("build.gradle")
cp("LICENSE")
cp("README.md")
}
}
スクリプトの解説
一番外側のスコープでroot
を定義しています。この時点ではスコープ上にプロジェクトが存在しないため、file
メソッドでの相対パスの基準はスクリプトのディレクトリと同じになります。
allprojects
スコープ内ではこれから作成しようとしているプロジェクトを参照できるようになります。
このスコープでは変数を宣言できますが、メソッドを宣言することはできないので処理を使い回すならクロージャを変数として宣言します。
新しく作ろうしているプロジェクトからの相対パスでファイルやディレクトリを参照したい時にはrootProject
経由でfile
メソッドを使うと変な事が起きづらい感じになります、ええ。
後は普通にGradleのタスクを定義しているだけですね。
ちなみに、このコードはtaichi/init_scriptsに公開してあるので、みんなオレオレinitタスクを作れば良いとオモウヨ。