web-dev-qa-db-ja.com

サブプロジェクトでgradleタスクを実行する

構成しようとしているMultiModule gradleプロジェクトがあります。

Root
    projA
    projB
    other
        projC
        projD
        projE
        ...

私ができるようにしたいのは、ルートbuild.gradleにタスクがあり、それが他のディレクトリの各プロジェクトでbuildJarタスクを実行することです。

できるとわかっている

configure(subprojects.findAll {it.name != 'tropicalFish'}) {
    task hello << { task -> println "$task.project.name"}
}

しかし、これはprojAとprojBも取得します。c、d、eでのみタスクを実行したいです...これを達成する最良の方法を教えてください。

39
Nathan Case

これらのどれを求めているかは完全にはわかりませんが、あなたのベースをカバーする必要があります。

1。タスクを直接呼び出す

あなたはただ電話できるはずです

gradle :other/projC:hello :other/projD:hello

私はこれでテストしました:

# Root/build.gradle
allprojects {
    task hello << { task -> println "$task.project.name" }
}

そして

# Root/settings.gradle
include 'projA'
include 'projB'
include 'other/projC'
include 'other/projD'

2。サブプロジェクトでのみタスクを作成

それとも、タスクをother/*プロジェクトでのみ作成したいですか?

後者の場合、次のように機能します。

# Root/build.gradle
allprojects {
    if (project.name.startsWith("other/")) {
        task hello << { task -> println "$task.project.name" }
    }
}

そして、次のようにして呼び出すことができます。

$ gradle hello
:other/projC:hello
other/projC
:other/projD:hello
other/projD

。サブプロジェクトのみでタスクを実行するタスクの作成

このバージョンは、あなたの質問の私の読書と一致します。つまり、サブプロジェクト(buildJar)に既にタスクがあり、サブプロジェクトother/*:buildJarのみを呼び出すルートにタスクを作成します。

allprojects {
    task buildJar << { task -> println "$task.project.name" }
    if (project.name.startsWith("other/")) {
        task runBuildJar(dependsOn: buildJar) {}
    }
}

これにより、すべてのプロジェクトでタスク「buildJar」が作成され、other/*プロジェクトでのみ「runBuildJar」が作成されるため、次のように呼び出すことができます。

$ gradle runBuildJar
:other/projC:buildJar
other/projC
:other/projC:runBuildJar
:other/projD:buildJar
other/projD
:other/projD:runBuildJar

あなたの質問は多くの方法で読むことができます、これがそれらすべてをカバーすることを望みます:)

48
Mark Fisher

私は同じ問題を抱えているため、今日この質問を見つけました。マークが言及した方法はすべて使用できますが、それらにはすべて欠点があります。そこで、もう1つのオプションを追加します。

4。現在のプロジェクトの切り替え

gradle -p other hello

これにより、「現在のプロジェクト」が切り替えられ、現在のプロジェクトの下でhelloという名前のすべてのタスクが実行されます。

38
Marwin