ใน Maven มีคุณสมบัติที่มีประโยชน์มากเมื่อคุณสามารถกำหนดการพึ่งพาใน<dependencyManagement>
ส่วนของ POM หลักและอ้างอิงการพึ่งพาจากโมดูลลูกโดยไม่ต้องระบุเวอร์ชันหรือขอบเขตหรืออะไรก็ตาม
ทางเลือกอื่นใน 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) ที่ควรกำหนดให้ อย่างไรก็ตามจากประสบการณ์ของฉันมันจะดีกว่าที่จะอธิบายเรื่องนี้อย่างชัดเจน
dependencies.gradle
ext.GROOVY = 'org.codehaus.groovy:groovy-all:2.1.6'
ในโครงการรากผมรวมbuild.gradle
allprojects { apply from: "$rootDir/dependencies.gradle" }
จากนั้นการอ้างอิงทั้งหมดจะถูกกำหนดไว้ในไฟล์เดียวแทนที่จะกระจายไปรอบ ๆ และจะใช้ค่าคงที่ "อ่านง่าย" มากขึ้นในการกำหนดค่าการอ้างอิง
allprojects
เนื่องจากคุณสมบัติพิเศษระดับโปรเจ็กต์จะมองเห็นได้สำหรับโปรเจ็กต์ย่อย
เป็นการตอบกลับที่ล่าช้า แต่คุณอาจต้องการดูที่: http://plugins.gradle.org/plugin/io.spring.dependency-management มันมีความเป็นไปได้ในการนำเข้า 'Bom' ของ maven และใช้คำจำกัดความซ้ำ กำหนดไว้ใน '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 ลงในบิลด์เดียวกัน
จากนั้นในโครงการ child gradle คุณสามารถละเว้น verison:
apply plugin: "java"
dependencies {
implementation("com.google.guava:guava")
}
รุ่นลูกยังคงสามารถเลือกระบุเวอร์ชันที่สูงกว่าได้ หากระบุเวอร์ชันที่ต่ำกว่าระบบจะอัปเกรดเป็นเวอร์ชันในข้อ จำกัด โดยอัตโนมัติ
allprojects
ก็ดีเช่นกัน
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
ที่จะเข้าใจเหตุผลของการแนะนำ
คุณสามารถรวมศูนย์การพึ่งพาโดยใช้รหัสด้านล่าง:
ใน 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 ของคุณสะอาดอยู่เสมอเราสามารถจัดกลุ่มการพึ่งพาในอาร์เรย์และนำไปใช้ในภายหลัง
// ประกาศเวอร์ชันของไลบรารี
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() }
ดังนั้นรหัสสุดท้ายจะมีลักษณะดังนี้:
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()
}