Gradle - รับการอ้างอิงเวอร์ชันล่าสุด


96

อะไรคือวิธีที่ง่ายที่สุดในการบอกGradleสิ่งต่อไปนี้:

ดึงข้อมูลการพึ่งพา 'junit' และใช้เวอร์ชัน 'release' ล่าสุด

การจัดการที่เก็บ Maven และ Ivy เป็นเรื่องใหม่สำหรับฉัน ฉันลองทำตามขั้นตอนต่อไปนี้แล้วและเกิดCould not resolve dependency ...ข้อผิดพลาด:

  • เขียนcompile "junit:junit:latest.release"โดยตั้งค่าที่เก็บเป็นเท่านั้นmavenCentral() (อย่างไรก็ตามจะใช้ได้ถ้าฉันพูดว่า "junit: junit: 4.10")

  • เขียนcompile "junit:junit:latest.release"ด้วยที่เก็บตั้งค่าวิธีต่อไปนี้:

    ivy {
        // I also tried 'http://maven.org' and other possible variants.           
        url "http://repo1.maven.org" 
        layout "maven"
    }
    
  • พยายามใช้ที่เก็บ Spring Source Ivy:

    ivy {
        artifactPattern "http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
        ivyPattern "http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
    }
    

บางทีฉันอาจเข้าใจผิดบางอย่าง เหตุใดการได้รับการพึ่งพาเวอร์ชันล่าสุดจึงเป็นงานที่ยากเช่นนี้


เวอร์ชันไดนามิกสามารถเป็นตัวยึดสำหรับเวอร์ชันล่าสุดที่มีlatest.integrationได้ เอกสารการไล่ระดับสีสำหรับเวอร์ชันไดนามิก
Bhavik

คำตอบ:


49

Gradle ไม่สนับสนุน Maven ของRELEASE(ซึ่งไม่ค่อยได้ใช้และเลิกใช้แล้ว) แต่มันก็ไม่สนับสนุนของ latest.releaseIvy อย่างไรก็ตามคำแนะนำทั่วไปคือสร้างเทียบกับเวอร์ชันที่แน่นอน มิฉะนั้นการสร้างอาจกลายเป็นลอตเตอรีได้


Maven ไม่รองรับ RELEASE เช่นกัน หมายเลขเวอร์ชันคงที่เท่านั้น
khmarbaise

10
ฉันตรวจสอบซ้ำแล้ว Maven รองรับRELEASEทั้งในเวอร์ชัน 2 และ 3
Peter Niederwieser

คุณพูดถูก ฉันเข้าใจผิดว่าด้วยเวอร์ชันปลั๊กอินทำให้ Maven 3 ไม่อนุญาตให้ปล่อย / ล่าสุดอีกต่อไป แต่เป็นแนวทางปฏิบัติที่ไม่ดีในการใช้ตัวระบุเวอร์ชันดังกล่าว
khmarbaise

สิ่งประดิษฐ์ในที่เก็บ Maven Release คือสิ่งที่ได้ทำการทดสอบอัตโนมัติทั้งหมดที่เป็นไปได้ (และอาจใช้ด้วยตนเอง) กระบวนการนั้นควรรวมถึงการตรวจสอบความเข้ากันได้ของ API การทดสอบการถดถอยและอื่น ๆ แล้วทำไมงานสร้างถึงกลายเป็นลอตเตอรี่ได้? เฉพาะในกรณีที่คุณกำลัง "ปล่อย" สิ่งประดิษฐ์ที่ไม่ได้รับการทดสอบอย่างเพียงพอ
RCross

2
เกรดรองรับ 'latest.release' (แต่ไม่ใช่ 'RELEASE') สิ่งนี้มีประโยชน์อย่างยิ่งในการตรวจสอบให้แน่ใจว่าไลบรารีภายในของคุณเป็นเวอร์ชันล่าสุดและได้รับการพิสูจน์แล้วแน่นอนว่าฉันจะไม่สนับสนุนการใช้ไลบรารีภายนอก / บุคคลที่สามด้วยเหตุผลเดียวกับที่ Peter แนะนำไว้ข้างต้น
RCross

261

ในบางครั้งการรับรุ่นล่าสุดอาจมีประโยชน์มากเช่นคุณปล่อยการอ้างอิงของคุณเองบ่อยๆ

คุณสามารถรับเวอร์ชันล่าสุดเช่น

compile "junit:junit:+"

หรือดีกว่าระบุอย่างน้อยเวอร์ชันหลักเช่น

compile "junit:junit:4.+"

28
เพียงเพื่อบันทึก: นั่นควรเป็นเครื่องหมายคำพูดคู่! ฉันใช้เครื่องหมายคำพูดเดี่ยวสำหรับการประกาศการอ้างอิงส่วนใหญ่ของฉันและพบว่าcode 'junit:junit:4.+'มันไม่ได้ผล
azonli

1
@azonli ดูเหมือนว่าจะใช้ได้กับฉันด้วยเครื่องหมายคำพูดเดียวอย่างน้อยก็สำหรับการอ้างอิงในท้องถิ่น คุณได้รับข้อผิดพลาดอะไร
David Moles

3
ไม่ควรเป็น "testCompile" แทนที่จะเป็น "compile"? เนื่องจากไม่จำเป็นต้องใช้สิ่งประดิษฐ์ในการเปิดตัว
Martin Dürrmeier

6
คุณไม่จำเป็นต้องมีงานสร้างที่ทำซ้ำได้เสมอไป
Lakatos Gyula

2
@SimonForsberg ... จริงอยู่อย่างไรก็ตามเมื่อคุณอยู่ระหว่างการพัฒนาคุณอาจต้องการ (a) ปฏิบัติตามขอบที่มีเลือดออกหรือ (b) ตรวจสอบให้แน่ใจว่าการแก้ไขข้อบกพร่องสำหรับ v 4.+จะได้รับการอัปเดตสำหรับโครงการของคุณ เมื่อ คุณไปถึงขั้นอัลฟ่าเบต้า -RC หรือ -RELEASE ฉันเห็นด้วยอย่างยิ่งที่คุณต้อง ' ตอก ' เวอร์ชันเหล่านั้นกับเสา ฉันใช้properties' file to set version specifiers: คอมไพล์ "junit: junit: $ { junitVer }" `
จะ

25

ตรวจสอบ Gradle-Versions-Plugin มันทำสิ่งที่คุณต้องการ: https://github.com/ben-manes/gradle-versions-plugin

สำหรับการติดตั้งโปรดดูที่หน้า github โดยทั่วไปคุณต้องเพิ่มสองบรรทัดนี้ในไฟล์ build.gradle - project:

apply plugin: 'com.github.ben-manes.versions'

buildscript {
    [...]
    dependencies {
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.8'
        [...]
    }
}
[...]

จากนั้นคุณสามารถใช้ปลั๊กอินได้โดยเรียกใช้คำสั่งนี้ในเทอร์มินัลในโครงการของคุณ:

./gradlew dependencyUpdates -Drevision=release

และจะแสดงให้คุณเห็นว่าการอ้างอิงใดล้าสมัย!


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

จะเกิดอะไรขึ้นถ้าการอ้างอิงอยู่ใน repo เดียวกันและคุณต้องการเวอร์ชันล่าสุดเสมอ?
Barry Kelly

8

คู่มือผู้ใช้ Gradle ล่าสุดกล่าวถึงและอธิบายเวอร์ชันการลงชื่อเข้าใช้แบบบวก:

จาก7.2. การประกาศการอ้างอิงของคุณ :

dependencies {
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

... สคริปต์การสร้างยังระบุด้วยว่าต้องใช้ junit> = 4.0 ใด ๆ เพื่อรวบรวมการทดสอบของโครงการ

จาก23.7. วิธีการแก้ปัญหาการอ้างอิง :

หากการอ้างอิงถูกประกาศเป็นเวอร์ชันไดนามิก (เช่น 1. +) Gradle จะแก้ไขสิ่งนี้เป็นเวอร์ชันคงที่ใหม่ล่าสุดที่พร้อมใช้งาน (เช่น 1.2) ในที่เก็บ สำหรับที่เก็บ Maven สิ่งนี้ทำได้โดยใช้ไฟล์ maven-metadata.xml ในขณะที่สำหรับที่เก็บ Ivy จะทำโดยการแสดงรายการไดเร็กทอรี


1
คำแนะนำที่สำคัญ: + ไม่จำเป็นต้องใช้เวอร์ชันล่าสุด ดูความคิดเห็นของฉันด้านบน
Harry G.

3

ใน Android Studio:

หากคุณกำลังใช้+สำหรับเวอร์ชันและต้องการทราบว่าเวอร์ชันใดถูกใช้งานจริงให้เลือกProjectในแถบด้านข้างจากนั้นExternal Librariesคุณจะเห็นหมายเลขเวอร์ชันที่ใช้งานจริง


คุณหมายถึง IDE เฉพาะหรือไม่? :-)
Inego

Inego: ใช่ฉันเพิ่มคำตอบแล้ว ;-)
lenooh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.