web-dev-qa-db-ja.com

Gradleおよびマルチプロジェクト構造

私は、次のプロジェクト設定にどのように取り組むべきかを理解しようとしています:

┌Top Android Project
│
├── Project 1 - (Pure Java Modules)
│    │
│    ├── Module A1
│    ├── Module B1
│    :
│    └── Module Z1
│  
├── Project 2 - (Android Libraries Modules)
│    │
│    ├── Module A2
│    ├── Module B2
│    :
│    └── Module Z2
│  
└── Module - Actual Android Project

現在のセットアップでは、各モジュールにbuild.gradleがありますが、このセットアップについて本当に嫌いなのは、build.gradleのすべてのコンテンツがモジュール間で複製されることです。

事実は、私はそれらのほとんどで同じロジックを望んでいるということです、「Pure Java Modules」はすべてインフラモジュールであり、出力をJarしたいJavaDoc、ソース、およびリモートリポジトリへのデプロイ(*デフォルト)。

一方、 'Pure Java Modules'のいくつかのモジュールは、たとえば、デフォルトの*ビルドとは別に、2番目のアジェンダを持ちたい特定のプロジェクトの依存関係を含むjarをデプロイしたい、など。

Actual Android Projectのビルド中に、モジュールをdefault *ビルドでコンパイルし、最後にmy =のすべてに対してデフォルトbuild.gradleを構成したいAndroidプロジェクト、これはかなり多く、そのファイルを複製したくありません。

============================================== =================

私が探しているのはMavenの親ポンポンのようなものですが、Gradleがどのように機能するかを完全に理解していないので、あなたの考えを共有するためにあなたにこれを公開しています...

すべてのモジュールのすべてのビルドロジックで何かを変更する可能性があるため、同じビルドファイルを複製することは(あえて)受け入れられないことを考慮してください

この種のセットアップを処理する最良の方法は何でしょうか?

60
TacB0sS

これのほとんどは、 http://www.gradle.org/docs/current/userguide/multi_project_builds.html ページにかなり正常です。ただし、追加する必要があります

evaluationDependsOn(':project1')
evaluationDependsOn(':project2')

したがって、gradleはモジュールの前にproject1とproject2を評価します。コードを含むすべてのプロジェクトでは、空のbuild.gradleファイルが必要です。これにより、必要に応じてプロジェクトをカスタマイズすることもできます。

例:https://github.com/ethankhall/AndroidComplexBuild

プロジェクトのルートにbuild.gradleを追加します。したがって、有用な情報が含まれる4つが必要です。

/build.gradle
/settings.gradle
/project1/build.gradle
/project2/build.gradle
/module/build.gradle

/build.gradle put

dependencies {
    project(":module")
}

/settings.gradle put

include ':module'
include ':project1', ':project1:A1', ':project1:B1', ':project1:Z1'
include ':project2', ':project2:A2', ':project2:B2', ':project2:Z2'

/project1/build.gradle put

apply plugin: 'Java'

subprojects {
    apply plugin: 'Java'

    sourceCompatibility = JavaVersion.VERSION_1_6
    targetCompatibility = JavaVersion.VERSION_1_6

    repositories{
        mavenCentral()
    }   

    //Anything else you would need here that would be shared across all subprojects
}

/project2/build.gradle

buildscript {
    repositories {
        mavenCentral()
    }   

    dependencies {
        classpath 'com.Android.tools.build:gradle:0.4.2'
    }   
}

subprojects {
    apply plugin: 'Android-library'

    Android {
        compileSdkVersion 17
        buildToolsVersion "17.0"
    }   

    sourceCompatibility = JavaVersion.VERSION_1_6
    targetCompatibility = JavaVersion.VERSION_1_6

    repositories{
        mavenCentral()
    }   

    //Anything else you would need here that would be shared across all subprojects
}

/module/build.gradle put

buildscript {
    repositories {
        mavenCentral()
    }   

    dependencies {
        classpath 'com.Android.tools.build:gradle:0.4.2'
    }   
}

evaluationDependsOn(':project1')
evaluationDependsOn(':project2')

apply plugin: 'Android'

Android {
    compileSdkVersion 17
    buildToolsVersion "17.0"
}

dependencies {
    compile project(":project1:A1")
    compile project(":project1:B1")
    compile project(":project1:Z1")

    compile project(":project2:A2")
    compile project(":project2:B2")
    compile project(":project2:Z2")
}
57
Ethan

その構造に一致するフォルダーがある場合は、複数のプロジェクトに同じビルドロジックを適用できます。

Settings.gradleに含まれている場合

include ':project2:moduleA2'

「:project2」もプロジェクトであり、独自のbuild.gradleを持つことができます。

subprojects { project ->
    apply plugin 'Android-library'

    // more configuration
}

':project2'自体にプラグインを適用しない場合、このプロジェクトは単に何も出力しません(おそらくあなたが望むものです)が、その方法ですべてのサブプロジェクトを簡単に設定できます。

次に、すべてのサブモジュールに、それらに固有のいくつかのロジックを配置させることもできます

すべてを同じファイルに保存する場合は、project2/build.gradleで技術的に行うこともできます。 http://www.gradle.org/docs/current/userguide/multi_project_builds.html を読むと、すべてのサブプロジェクトまたは特定のサブプロジェクトにアクセスして、親build.gradleファイルからサブプロジェクトを構成する方法を確認できます。 1つ、またはフィルタリングを使用します。

8
Xavier Ducrohet