ใน Gradle ฉันจะประกาศการอ้างอิงทั่วไปในที่เดียวได้อย่างไร


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 } จากนั้นจะเพิ่มการอ้างอิงทั้งสองพร้อมกัน

ข้อมูลชิ้นเดียวที่คุณไม่สามารถแบ่งปันได้ในลักษณะนี้คือการกำหนดค่าใด ( ขอบเขตในเงื่อนไข Maven) ที่ควรกำหนดให้ อย่างไรก็ตามจากประสบการณ์ของฉันมันจะดีกว่าที่จะอธิบายเรื่องนี้อย่างชัดเจน


3
ขอบคุณสิ่งนี้ช่วยแก้คำถามของฉันได้ แต่ก็ยังมีข้อกังวล .. ใน Maven เราสามารถปล่อยให้เวอร์ชันว่างเปล่าและถ้าเป็น lib ก็สะดวกเพราะคุณสามารถใช้ในแอปของเราและทำการ dependencyManagement เพื่อกำหนดเวอร์ชันของ lib ควรใช้ คุณจะทำเช่นเดียวกันกับ Gradle อย่างไร?
Stanislav Bashkyrtsev

ฉันไม่เข้าใจคำถาม โปรดให้ตัวอย่าง
Peter Niederwieser

4
Peter สิ่งที่ ctapobep กำลังพูดคือใน maven คุณสามารถประกาศการอ้างอิงด้วยเวอร์ชัน (และขอบเขต) ใน pom ผู้ปกครอง (หรือตัวรวบรวม) ในส่วนการพึ่งพาการจัดการ จากนั้นในปอม "คอนกรีต" คุณไม่จำเป็นต้องประกาศเวอร์ชันอีกครั้ง เพียงสิ่งประดิษฐ์และ groupId โดยทั่วไปจะบอก maven ว่า "ฉันต้องการ X: Y แต่ใช้เวอร์ชันใดก็ได้ที่ผู้ปกครองกำหนดไว้"
Michael Campbell

2
เพื่อหลีกเลี่ยงชนิดของการทำสำเนานี้ผมมีแนวโน้มที่จะสร้างแยกต่างหากสคริปต์ที่ฉันกำหนดอ้างอิงทั้งหมดของฉันเป็นคุณสมบัติเช่น:dependencies.gradle ext.GROOVY = 'org.codehaus.groovy:groovy-all:2.1.6'ในโครงการรากผมรวมbuild.gradle allprojects { apply from: "$rootDir/dependencies.gradle" }จากนั้นการอ้างอิงทั้งหมดจะถูกกำหนดไว้ในไฟล์เดียวแทนที่จะกระจายไปรอบ ๆ และจะใช้ค่าคงที่ "อ่านง่าย" มากขึ้นในการกำหนดค่าการอ้างอิง
Steinar

1
นั่นคือสิ่งที่ฉันทำข้างต้น คุณไม่จำเป็นต้องสมัครallprojectsเนื่องจากคุณสมบัติพิเศษระดับโปรเจ็กต์จะมองเห็นได้สำหรับโปรเจ็กต์ย่อย
Peter Niederwieser

7

เป็นการตอบกลับที่ล่าช้า แต่คุณอาจต้องการดูที่: http://plugins.gradle.org/plugin/io.spring.dependency-management มันมีความเป็นไปได้ในการนำเข้า 'Bom' ของ maven และใช้คำจำกัดความซ้ำ กำหนดไว้ใน 'Bom' มันเป็นความช่วยเหลือที่ดีอย่างแน่นอนเมื่อค่อยๆอพยพจาก maven ไปยัง gradle! สนุกกับมันตอนนี้


มันเป็นสิ่งที่ต้องมีเมื่อคุณต้องการแบ่งปันการอ้างอิงเดียวกันในหลายโครงการ (หลายโครงการ)
roomsg

7
แม้ว่าจะสะดวก แต่ปลั๊กอินนี้อาจมีประสิทธิภาพที่สำคัญ สำหรับโปรเจ็กต์ย่อย 30 โปรเจ็กต์ที่มีการอ้างอิงมากกว่า 200 รายการจะเพิ่มเฟสการแก้ปัญหาการพึ่งพาได้สูงสุด 1 นาที สำหรับโปรเจ็กต์เล็ก ๆ มันใช้งานได้อย่างมีเสน่ห์
Jk1

นอกจากนี้ยังลบล้างเวอร์ชันที่ขึ้นต่อกันด้วยเช่นกันกล่าวว่าคุณได้ประกาศเวอร์ชัน 3.0.0 ในการจัดการการพึ่งพา แต่สำหรับหนึ่งในโครงการย่อยคุณต้องใช้เวอร์ชันที่เก่ากว่าเช่น 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 :

แนวทางปฏิบัติที่แนะนำสำหรับโครงการขนาดใหญ่คือการประกาศการอ้างอิงโดยไม่มีเวอร์ชันและใช้ข้อ จำกัด การพึ่งพาสำหรับการประกาศเวอร์ชัน ข้อดีคือข้อ จำกัด ในการพึ่งพาช่วยให้คุณสามารถจัดการเวอร์ชันของการอ้างอิงทั้งหมดรวมทั้งแบบสกรรมกริยาได้ในที่เดียว

ในbuild.gradleไฟล์หลักของคุณ:

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

การห่อบล็อกการอ้างอิงด้วยการตรวจสอบปลั๊กอิน Java (... whenPluginAdded {) ไม่จำเป็นอย่างยิ่ง แต่จะจัดการเพิ่มโปรเจ็กต์ที่ไม่ใช่ Java ลงในบิลด์เดียวกัน

จากนั้นในโครงการ child gradle คุณสามารถละเว้น verison:

apply plugin: "java"

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

รุ่นลูกยังคงสามารถเลือกระบุเวอร์ชันที่สูงกว่าได้ หากระบุเวอร์ชันที่ต่ำกว่าระบบจะอัปเกรดเป็นเวอร์ชันในข้อ จำกัด โดยอัตโนมัติ


1
มีการเพิ่มข้อ จำกัด การพึ่งพาใน Gralde 4.6 ดังนั้นสิ่งนี้จะใช้ได้กับ Gradle 4.6 หรือสูงกว่า
Jim Hurne

ฉันคิดว่า Gradle ระบุว่ามีการใช้ปลั๊กอินแพลตฟอร์ม Javaในกรณีเช่นนี้ อย่างไรก็ตามเอกสาร Gradle ยังไม่ชัดเจนในตอนนี้ ฉันเดาว่าการใช้งานallprojectsก็ดีเช่นกัน
JojOatXGME

ฉันต้องการประกาศข้อ จำกัด ในโปรเจ็กต์รูท แต่ในโปรเจ็กต์ย่อยของฉันเท่านั้นฉันต้องการโหลดการอ้างอิงทั้งหมดที่มีการกำหนดข้อ จำกัด
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 โพสต์บล็อกอย่างเป็นทางการของการจัดการที่ดีกว่าสำหรับการพึ่งพา Gradleio.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 (ระดับแอป) นอกบล็อกการพึ่งพา :

// ใช้เวอร์ชันในไลบรารีและเพิ่มการอ้างอิงพร้อมกับชื่อการเข้าถึง (เช่นชุดติดตั้งเพิ่มเติม (อันแรก))

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.