119

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

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

4

10 に答える 10

185

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

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用語ではスコープ)です。しかし、私の経験から、とにかくこれについて明確にする方が良いです。

于 2012-03-03T16:15:46.410 に答える
11

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プロジェクトでは、単純にバージョンを省略できます。

apply plugin: "java"

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

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

于 2019-01-02T23:10:24.847 に答える
8

返信が遅れていますが、以下もご覧ください。http: //plugins.gradle.org/plugin/io.spring.dependency-management Maven'bom'をインポートし、定義を再利用する可能性を提供します。 'bom'で定義されています。MavenからGradleに徐々に移行する場合は、確かに便利です。今それを楽しんでいます。

于 2014-10-31T14:11:05.250 に答える
3

io.spring.gradle:dependency-management-pluginプラグインには新しいGradle3.xシリーズで問題がありますが、2.xシリーズでは安定しています。参考までに、バグレポートを参照してください。Gradle3#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'
}

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

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

$ 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ください。

于 2017-02-18T07:37:04.447 に答える
2

ルートプロジェクトにコンテンツを含むcommon_dependencies.gradleファイルを作成することをお勧めします

buildscript {
ext {
    commonDependencies = [
            redis      : 'redis.clients:jedis:3.6.3',
            lettuce    : 'io.lettuce:lettuce-core:6.1.4.RELEASE'
      ]
   }
}

次に、ルート/サブモジュールのbuild.gradleで

apply from: rootProject.file("common_dependencies.gradle")

dependencies {
    commonDependencies.values().forEach {
        implementation it
    }
}
于 2021-08-08T08:16:29.283 に答える
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}"
}
于 2017-10-02T07:32:52.980 に答える
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
}
于 2017-12-01T00:58:06.013 に答える
1

gradle 7.1.1以降、バージョンカタログを使用できます

https://docs.gradle.org/current/userguide/platforms.html

https://melix.github.io/blog/2021/03/version-catalogs.html

于 2021-08-16T03:46:56.697 に答える
1

dattaが回答で述べたように、Gradleにはバージョンカタログと呼ばれるものがあります。
Kotlin DSL(* .kts)の例を次に示します。Gradle7.4を使用していることに注意してください。

settings.gradle.ktsでの依存関係の定義:

// Configure dependencies aspects applied to all projects
dependencyResolutionManagement {
    // By default, repositories declared by a project will override the ones here.
    // You can change this behavior with the repositoriesMode property.
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)

    // Define repositories for all projects
    repositories {
        mavenCentral()
        maven("https://jitpack.io")
    }

    versionCatalogs {
        create("libs") {
            // Versions are useful specially when you have libraries with the same
            // group and version which are updated together with the same version
            version("room", "2.4.1")
            //       │       │
            //       │       └───> The version notation
            //       └───> Your desired name (alias)
    
            library("material", "com.google.android.material:material:1.4.0")
            //       │           │
            //       │           └───> The dependency notation (coordinates)
            //       ├───> Your desired name (alias); only letters, digits and _ - .
            //       └───> Note that _ - . will all be normalized to .
    
            // You can configure the version as you would in regular build file
            // Note that the group and module are separate parameters
            library("junit5", "org.junit.jupiter", "junit-jupiter").version {
                prefer("5.8.0")
            }
    
            // Using the same version for multiple dependencies
            library("room-ktx", "androidx.room", "room-ktx").versionRef("room")
            library("room-runtime", "androidx.room", "room-runtime").versionRef("room")
        }
    }
}

build.gradle.ktsでの使用法:

dependencies {
    implementation(libs.material)
    implementation(libs.room.ktx)
    implementation(libs.room.runtime)
    testImplementation(libs.junit5)
}

ご覧のとおり、依存関係を宣言できるだけでなく、ここでリポジトリを宣言することもできます(allprojects最上位のビルドスクリプトでブロックを使用してすべてのサブプロジェクトのリポジトリを定義する代わりに)。

上記のソリューションのGroovy構文、およびバージョンカタログとリポジトリと依存関係の構成の集中化の詳細については、Gradleの公式ガイドを参照してください。

于 2022-02-12T15:42:10.020 に答える
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()
}
于 2019-06-24T05:35:15.723 に答える