[gradle] Gradle에서 한 곳에서 공통 종속성을 어떻게 선언합니까?

Maven에는 <dependencyManagement>상위 POM 의 섹션에 종속성을 정의 하고 버전이나 범위 등을 지정하지 않고 하위 모듈에서 해당 종속성을 참조 할 수있는 매우 유용한 기능이 있습니다 .

Gradle의 대안은 무엇입니까?



답변

상위 스크립트에서 공통 종속성을 선언 할 수 있습니다.

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 } 그런 다음 두 종속성을 한 번에 추가합니다.

이러한 방식으로 공유 할 수없는 정보 중 하나 는 종속성을 할당해야하는 구성 ( Maven 용어의 범위 )입니다. 그러나 내 경험상 어쨌든 이것에 대해 명시하는 것이 좋습니다.


답변

답변이 늦었지만 http://plugins.gradle.org/plugin/io.spring.dependency-management
메이븐 ‘bom’을 가져와 정의를 재사용 할 수있는 가능성을 제공합니다. ‘bom’에 정의되어 있습니다. maven에서 gradle로 점차 마이그레이션 할 때 확실히 좋은 도움이됩니다! 지금 즐기고 있습니다.


답변

Gradle 4.6부터는이를 달성하기위한 방법으로 문서에 종속성 제약 조건이 제안되어 있습니다. 에서 https://docs.gradle.org/current/userguide/declaring_dependencies.html#declaring_a_dependency_without_version :

대규모 프로젝트에 권장되는 방법은 버전없이 종속성을 선언하고 버전 선언에 종속성 제약 조건을 사용하는 것입니다. 장점은 종속성 제약 조건을 통해 전 이적 종속성을 포함하여 모든 종속성의 버전을 한 곳에서 관리 할 수 ​​있다는 것입니다.

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

하위 빌드는 여전히 더 높은 버전을 지정하도록 선택할 수 있습니다. 더 낮은 버전이 지정되면 제약 조건의 버전으로 자동 업그레이드됩니다.


답변

io.spring.gradle:dependency-management-plugin플러그인은 새로운 Gradle 3.x 시리즈에 문제가 있지만 2.x 시리즈에는 안정적입니다. 참고 로 Gradle 3 # 115에 대한 버그 보고서 Drop 지원을 참조하세요.

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-bomorg.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.


답변

아래 코드를 사용하여 종속성을 중앙화 할 수 있습니다 .

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


답변

이 블로그 게시물은 종속성 및 그룹을 구성으로 관리하는 것을 제안합니다.
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
}


답변

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