web-dev-qa-db-ja.com

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

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

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

99

親スクリプトで共通の依存関係を宣言できます。

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つは、依存関係を割り当てる構成(scope Mavenの用語)です。しかし、私の経験から、とにかくこれについて明示する方が良いです。

167

返信が遅くなりますが、次の情報もご覧ください。 http://plugins.gradle.org/plugin/io.spring.dependency-management Mavenをインポートできるbom」、「bom」で定義された定義を再利用します。徐々にMavenからGradleに移行するとき、それは確かに素晴らしい助けです!今それを楽しんでいます。

7
roomsg

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")
}

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

4
Adrian Baker

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

2
gavenkoa

このブログ投稿では、依存関係とグループを構成として管理することを推奨しています: 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
}
1
tkruse

以下のコードを使用してcentralize依存関係を作成できます。

In 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}"
}
0
Dhaval Jivani

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. そして、dependency block

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

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()
}
0
Suraj Vaishnav