Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした