Gradleでは、共通の依存関係を1つの場所でどのように宣言しますか?


109

Mavenには<dependencyManagement>、親POMのセクションで依存関係を定義し、バージョンやスコープなどを指定せずに子モジュールからその依存関係を参照できる非常に便利な機能があります。

Gradleの代替手段は何ですか?

回答:


179

親スクリプトで一般的な依存関係を宣言できます。

ext.libraries = [ // Groovy map literal
    spring_core: "org.springframework:spring-core:3.1",
    junit: "junit:junit:4.10"
]

子スクリプトから、依存関係の宣言を次のように使用できます。

dependencies {
    compile libraries.spring_core
    testCompile libraries.junit
}

依存関係の宣言を高度な構成オプションと共有するには、次を使用できますDependencyHandler.create

libraries = [
    spring_core: dependencies.create("org.springframework:spring-core:3.1") {
        exclude module: "commons-logging"
        force = true
    }
]

複数の依存関係を同じ名前で共有できます。

libraries = [
    spring: [ // Groovy list literal
        "org.springframework:spring-core:3.1", 
        "org.springframework:spring-jdbc:3.1"
    ]
]

dependencies { compile libraries.spring } 次に、両方の依存関係を一度に追加します。

この方法で共有できない情報の1つは、依存関係を割り当てる必要がある構成(Maven用語ではスコープ)です。しかし、私の経験から、とにかくこれについて明示することをお勧めします。


3
おかげで、これで私の質問は解決しますが、懸念は残ります。Mavenでは、バージョンを空のままにすることができます。これがlibの場合は、アプリでそれを使用してdependencyManagementを作成し、libのバージョンを定義できるので便利です。それは取る必要があります。Gradleで同じことをするにはどうしますか?
Stanislav Bashkyrtsev

質問が理解できません。例を挙げてください。
Peter Niederwieser

4
Peter、ctapobepが言っていることは、mavenでは、dependencyManagementセクションの親(またはアグリゲーター)pomでバージョン(およびスコープ)を使用して依存関係を宣言できることです。次に、「具体的な」pomで、バージョンを再宣言する必要はありません。アーティファクトとgroupIdのみ。基本的には、Mavenに「X:Yが必要ですが、親が設定したバージョンを使用してください」と伝えます。
マイケルキャンベル

2
このような重複を避けるためdependencies.gradleに、すべての依存関係をプロパティとして定義する別のスクリプトを作成する傾向がありますext.GROOVY = 'org.codehaus.groovy:groovy-all:2.1.6'。例:ルートプロジェクトbuild.gradleに含めますallprojects { apply from: "$rootDir/dependencies.gradle" }。次に、すべての依存関係が1つのファイルに分散されるのではなく、1つのファイルで定義され、依存関係の構成でより「読みやすい」定数が使用されます。
Steinar 2013年

1
それはまさに私が上記でやったことです。allprojectsプロジェクトレベルの追加プロパティはサブプロジェクトに表示されるため、適用する必要はありません。
Peter Niederwieser 2013年

7

これは遅い返信ですが、次のページもご覧になる ことをお勧めします。 「bom」で定義されています。MavenからGradleに徐々に移行するときに、これは確かに役立ちます。今それを楽しんでいます。


複数の(マルチ)プロジェクト間で同じ依存関係を共有したい場合でも、必須です。
roomsg 2014年

7
このプラグインは便利ですが、パフォーマンスが大幅に向上する可能性があります。200以上の依存関係を持つ30のサブプロジェクトの場合、依存関係解決フェーズに最大1分追加されます。小規模なプロジェクトでは、それはしかし、魔法のように動作
JK1

また、依存関係の管理でバージョン3.0.0を宣言したとしても、推移的な依存関係のバージョンを上書きしますが、サブプロジェクトの1つで2.5.0などの古いバージョンを使用する必要がある場合、この古いプロジェクトに依存するプロジェクトがある場合は、推移的な依存関係は2.5.0から依存関係管理プラグインで宣言されたものに上書きされるため、この場合3.0.0は非常に奇妙な動作になります
KameeCoding

7

Gradle 4.6以降、これを実現する方法として依存関係の制約がドキュメントで推奨されています。https://docs.gradle.org/current/userguide/declaring_dependencies.html#declaring_a_dependency_without_versionから:

大規模なプロジェクトで推奨される方法は、バージョンなしで依存関係を宣言し、バージョン宣言に依存関係制約を使用することです。利点は、依存関係の制約により、推移的なものを含むすべての依存関係のバージョンを1か所で管理できることです。

build.gradleファイル:

allprojects {
  plugins.withType(JavaPlugin).whenPluginAdded {
    dependencies {
      constraints {
        implementation("com.google.guava:guava:27.0.1-jre")
      }
    }
  }
}

Javaプラグイン(... whenPluginAdded {)のチェックを使用して依存関係ブロックをラップすることは厳密には必要ありませんが、同じビルドへの非Javaプロジェクトの追加を処理します。

次に、子gradleプロジェクトで単純にverisonを省略できます:

apply plugin: "java"

dependencies {
  implementation("com.google.guava:guava")
}

子ビルドは、より高いバージョンを指定することを選択できます。下位バージョンが指定されている場合は、制約のバージョンに自動的にアップグレードされます。


1
依存関係の制約はGralde 4.6で追加されたため、Gradle 4.6以降で機能します。
ジム・ハーン

Gradleは、そのような場合にJavaプラットフォームプラグインが使用されると規定しています。ただし、現時点では、Gradleのドキュメントはあまり明確ではありません。の使い方もいいと思いallprojectsます。
JojOatXGME、

ルートプロジェクトで制約を宣言したいのですが、自分のサブプロジェクトの1つだけで、制約が定義されている依存関係をすべてロードしたいと思います。
dtc

2

io.spring.gradle:dependency-management-pluginプラグインは新しいGradle 3.xシリーズで問題がありますが、2.xシリーズでは安定しています。バグレポートへの参照を参照してくださいGradle 3#115のドロップサポート

Spring(BOM使用のメインプロモーター)の場合、次のように終了します。

buildscript {
    repositories {
        mavenLocal()
        jcenter()
    }
    dependencies {
        classpath 'io.spring.gradle:dependency-management-plugin:1.0.0.RELEASE'
    }
}

repositories {
    mavenLocal()
    jcenter()
}

apply plugin: 'java'
apply plugin: 'io.spring.dependency-management'

dependencyManagement {
    imports {
        mavenBom 'io.spring.platform:platform-bom:Athens-SR3'
    }
}

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'

    testCompile 'org.springframework.boot:spring-boot-starter-test'
}

親としてio.spring.platform:platform-bom持ってorg.springframework.boot:spring-boot-starter-parentいるので、Spring Bootと互換性があることに注意してください

次の方法で実際の依存関係の解決を確認できます。

$ gradle dependencies
$ gradle dependencies --configuration compile
$ gradle dependencies -p $SUBPROJ

$ gradle buildEnvironment
$ gradle buildEnvironment -p $SUBPROJ

またはタスク付き:

task showMeCache {
    configurations.compile.each { println it }
}

導入の理由を理解するには、Soringの公式ブログ投稿「Gradleのより良い依存関係管理」を読んでくださいio.spring.gradle:dependency-management-plugin


1

以下のコードを使用して依存関係を集中化できます:

gradle.properties

COMPILE_SDK_VERSION=26
BUILD_TOOLS_VERSION=26.0.1
TARGET_SDK_VERSION=26
MIN_SDK_VERSION=14

ANDROID_SUPPORT_VERSION=26.0.2

各モジュールに追加build.gradle

android {
    compileSdkVersion COMPILE_SDK_VERSION as int
    buildToolsVersion BUILD_TOOLS_VERSION as String

    defaultConfig {
        minSdkVersion MIN_SDK_VERSION as int
        targetSdkVersion TARGET_SDK_VERSION as int
        versionCode 1
        versionName "1.0"

    }

}

dependencies {
 compile "com.android.support:appcompat-v7:${ANDROID_SUPPORT_VERSION}"
 compile "com.android.support:support-v4:${ANDROID_SUPPORT_VERSION}"
 compile "com.android.support:support-annotations:${ANDROID_SUPPORT_VERSION}"
 compile "com.android.support:support-vector-drawable:${ANDROID_SUPPORT_VERSION}"
 compile "com.android.support:design:${ANDROID_SUPPORT_VERSION}"
}

1

このブログ投稿では、依存関係とグループを構成として管理することを推奨しています。https//www.javacodegeeks.com/2016/05/manage-dependencies-gradle-multi-project-build.html

私自身は試していませんが、面白そうです。

ルートプロジェクトbuild.gradle

subprojects {
  configurations {
    commonsIo
  }

  dependencies {
    commonsIo 'commons-io:commons-io:2.5'
  }
}

サブプロジェクトbuild.gradle

configurations {
  compile.extendsFrom commonsIo
}

0

Gradleファイルをクリーンに保つために、依存関係を配列にグループ化し、後で実装できます。

  1. このようなライブラリのバージョンを、依存関係ブロックの外側のbuild.gradle(アプリレベル)に追加します

//ライブラリのバージョンを宣言します

final RetrofitVersion = '2.3.0'
final OkHttpVersion = '3.9.1'
  1. 後で簡単に見つけられるように、関連する依存関係の配列を作成します。依存関係ブロックの外側のbuild.gradle(アプリレベル)に追加します

//ライブラリでバージョンを使用し、アクセス名とともに依存関係を追加します(retrofit(first one)など)

final networkDependencies = [
        retrofit             : "com.squareup.retrofit2:retrofit:${RetrofitVersion}",
        retrofitGsonConverter: "com.squareup.retrofit2:converter-gson:${RetrofitVersion}",
        retrofitRxJavaAdapter: "com.squareup.retrofit2:adapter-rxjava2:${RetrofitVersion}",
        okHttp3              : "com.squareup.okhttp3:okhttp:${OkHttpVersion}",
        okHttp3Logging       : "com.squareup.okhttp3:logging-interceptor:${OkHttpVersion}"
]
  1. そして依存ブロックでは

//配列からすべての依存関係を実装します

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation networkDependencies.values()
}

したがって、最終的なコードは次のようになります。

final RetrofitVersion = '2.3.0'
final OkHttpVersion = '3.9.1'

final networkDependencies = [
        retrofit             : "com.squareup.retrofit2:retrofit:${RetrofitVersion}",
        retrofitGsonConverter: "com.squareup.retrofit2:converter-gson:${RetrofitVersion}",
        retrofitRxJavaAdapter: "com.squareup.retrofit2:adapter-rxjava2:${RetrofitVersion}",
        okHttp3              : "com.squareup.okhttp3:okhttp:${OkHttpVersion}",
        okHttp3Logging       : "com.squareup.okhttp3:logging-interceptor:${OkHttpVersion}"
]

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation networkDependencies.values()
}

これによって注釈プロセッサを含める方法?? ロンボクの場合のように
Pritish Joshi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.