LoginSignup
11
12

More than 5 years have passed since last update.

Gradle で initタスクをカスタマイズする方法

Last updated at Posted at 2014-12-26

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タスクを作れば良いとオモウヨ。

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12