Maven Snapshot คืออะไรและทำไมเราต้องใช้


คำตอบ:


1013

เวอร์ชันสแน็ปช็อตใน Maven เป็นเวอร์ชันที่ยังไม่ได้เผยแพร่

แนวคิดก็คือว่าก่อน1.0ปล่อย (หรือปล่อยอื่น ๆ ) 1.0-SNAPSHOTจะทำมีอยู่ ว่ารุ่นคือสิ่งที่อาจจะกลายเป็น 1.0มันคือ " 1.0กำลังพัฒนา" โดยทั่วไป นี่อาจใกล้เคียงกับรี1.0ลีสจริงหรือค่อนข้างไกล (เช่นหลังจากรี0.9ลีส)

ความแตกต่างระหว่างเวอร์ชัน "ของจริง" และเวอร์ชันของสแน็ปช็อตคือสแน็ปช็อตอาจได้รับการอัพเดต นั่นหมายความว่าการดาวน์โหลด1.0-SNAPSHOTวันนี้อาจให้ไฟล์ที่แตกต่างจากการดาวน์โหลดเมื่อวานนี้หรือพรุ่งนี้

โดยปกติแล้วการพึ่งพาสแน็ปช็อตควรมีอยู่ในระหว่างการพัฒนาเท่านั้นและไม่มีเวอร์ชันที่วางจำหน่าย


67
@amphibient: ไม่ภาพรวมไม่จำเป็นต้องมีเสถียรภาพมากขึ้น: มันเป็นเพียงการสร้างล่าสุด สแน็ปช็อตนำหน้าการเปิดตัวจริง แต่ไม่ได้มาหลังจากปล่อย โดยปกติแล้วหมายเลขรุ่นจะไม่อ้างอิงถึงสาขา
avandeursen

9
@avandeursen ภาพรวมไม่จำเป็นต้องมีความหมายที่คุณอ้างสิทธิ์ คุณสามารถมี "master-SNAPSHOT" และรุ่นที่ใหม่กว่าปล่อย 1.0 ไม่จำเป็นต้องเป็น "FutureVersion-SNAPSHOT" และไม่จำเป็นต้องมาก่อนการเปิดตัว ทุกอย่างถูกต้องแล้ว - มันเป็นการอ้างอิงที่ไม่แน่นอนไปยังเป้าหมายที่กำลังเคลื่อนที่และไม่สามารถเชื่อถือได้ในการสร้างงานสร้างซ้ำ
Scott Carey

3
ขอบคุณ @ScottCarey "นำหน้าโดยทั่วไป" น่าจะแม่นยำมากกว่านี้แน่นอนเนื่องจากไม่มีการรับประกันว่า "เป้าหมายที่เคลื่อนที่" จะมีอยู่ในที่สุด
avandeursen

1
@ เจย์: ไม่เท่าที่ฉันรู้ว่าไม่มีทางที่จะอ้างอิง SNAPSHOT เฉพาะอย่างชัดเจนพวกเขาไม่สามารถระบุแอดเดรส / เปลี่ยนได้โดยการออกแบบ หากคุณต้องการการกำหนดเวอร์ชันที่ละเอียดคุณควรปล่อยรีลีสผู้สมัครด้วยสตริงรุ่นเฉพาะ (-RC1, -RC2 หรืออะไรทำนองนั้น)
Joachim Sauer

14
ทำไมพวกเขาไม่สามารถเรียกมันว่า " 1.0-DEVELOPMENT" หรือชอบ " 1.0-INPROGRESS" ทำไมผู้คนต้องใช้คำที่ไม่ชัดเจน
uh_big_mike_boi

792

คำตอบอื่น ๆ อีกสามคำจะช่วยให้คุณมีวิสัยทัศน์ที่ดีว่า-SNAPSHOTรุ่นคืออะไร ฉันแค่ต้องการเพิ่มข้อมูลเกี่ยวกับพฤติกรรมของ Maven เมื่อพบว่ามีการSNAPSHOTพึ่งพา

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

ตัวอย่างเช่นfoo-1.0.jarไลบรารีถูกพิจารณาว่าเป็นเวอร์ชันที่เสถียรและหาก Maven พบไลบรารีในที่เก็บโลคัลไลบรารีจะใช้ไลบรารีนี้สำหรับบิลด์ปัจจุบัน

ตอนนี้ถ้าคุณต้องการfoo-1.0-SNAPSHOT.jarห้องสมุด Maven จะรู้ว่าเวอร์ชั่นนี้ไม่เสถียรและอาจมีการเปลี่ยนแปลง นั่นเป็นสาเหตุที่ Maven จะพยายามค้นหารุ่นที่ใหม่กว่าในที่เก็บระยะไกลแม้ว่าจะพบรุ่นของห้องสมุดนี้ในที่เก็บข้อมูลในเครื่องก็ตาม อย่างไรก็ตามการตรวจสอบนี้ทำเพียงครั้งเดียวต่อวัน นั่นหมายความว่าถ้าคุณมีfoo-1.0-20110506.110000-1.jar(เช่นห้องสมุดนี้ถูกสร้างขึ้นใน 2011/05/06 เวลา 11:00:00) ในพื้นที่เก็บข้อมูลในพื้นที่ของคุณและถ้าคุณเรียกใช้ Maven build อีกครั้งในวันเดียวกัน Maven จะไม่ตรวจสอบที่เก็บ สำหรับรุ่นที่ใหม่กว่า

Maven ให้วิธีการเปลี่ยนนโยบายการอัปเดตนี้ในคำจำกัดความที่เก็บของคุณ:

<repository>
    <id>foo-repository</id>
    <url>...</url>
    <snapshots>
        <enabled>true</enabled>
        <updatePolicy>XXX</updatePolicy>
    </snapshots>
</repository>

จะอยู่ที่ไหนXXX:

  • เสมอ : Maven จะตรวจสอบเวอร์ชันที่ใหม่กว่าในทุกบิลด์
  • รายวันค่าเริ่มต้น;
  • ช่วงเวลา: XXX : ช่วงเวลาเป็นนาที (XXX)
  • ไม่เคย : Maven จะไม่พยายามเรียกคืนเวอร์ชันอื่น มันจะทำอย่างนั้นก็ต่อเมื่อไม่มีอยู่ในเครื่อง ด้วยการกำหนดค่าSNAPSHOTเวอร์ชันจะถูกจัดการเป็นไลบรารีที่มีเสถียรภาพ

(รุ่นของ settings.xml สามารถดูได้ที่นี่)


2
ดูเหมือนว่าเป็นไปได้ที่จะใช้สวิตช์บรรทัดคำสั่งเพื่อบังคับให้ Maven ทำการดาวน์โหลดทุกSNAPSHOTรุ่นอีกครั้ง: mvn clean package -Uตามการสอน Maven
Dimitry K

3
ระวังด้วย-Uธง มันอาจจะไม่ทำในสิ่งที่คุณคาดหวังเนื่องจากMNG-4142
Kevin Cross

3
นอกจากนี้ยังควรกล่าวถึงการปฏิบัติที่ดีว่าคุณไม่ต้องใช้การพึ่งพาสแนปช็อตเมื่อคุณสร้างเวอร์ชันรีลีสและ Maven Release Plugin จะล้มเหลวหากมีสแนปชอตอ้างอิงอยู่
RCross

2
ฉันวิ่งmvn installไปติดตั้ง jar เวอร์ชัน 1.0-SNAPSHOT ลงใน repo ในพื้นที่ของฉัน ในวันถัดไปฉันทำการเปลี่ยนแปลงโครงการ แต่ไม่ได้เปลี่ยนรุ่น - จากนั้นเมื่อเรียกใช้mvn installดูเหมือนจะไม่เปลี่ยนใน repo ท้องถิ่นของฉัน นั่นเป็นพฤติกรรมที่คาดหวังหรือไม่? ฉันไม่สามารถใช้เวอร์ชันใหม่และเขียนทับมันด้วยmvn installหลังจากทำการเปลี่ยนแปลงได้หรือไม่?
Don Cheadle

1
@mmcrae AFAIK ควรได้รับการอัปเดต นั่นคือเป้าหมายการติดตั้งสิ่งที่ต้องทำการอัพเดตไห SNAPSHOT ท้องถิ่น คุณค้นพบสิ่งอื่นหรือไม่?
จอห์นนี่

73

คำว่า "SNAPSHOT" หมายความว่าบิลด์เป็นสแน็ปช็อตของโค้ดในเวลาที่กำหนด

มันมักจะหมายความว่ารุ่นนี้ยังอยู่ภายใต้การพัฒนาอย่างมาก

เมื่อรหัสพร้อมใช้งานและถึงเวลาที่จะเผยแพร่คุณจะต้องเปลี่ยนรุ่นที่ระบุไว้ใน POM จากนั้นแทนที่จะมี "SNAPSHOT" คุณจะต้องใช้ป้ายกำกับเช่น "1.0"

สำหรับความช่วยเหลือบางอย่างกับเวอร์ชันตรวจสอบสเปครุ่นความหมาย


ในแง่ของการกำหนดเวอร์ชันแบบ semantic การวางจำหน่าย -SNAPSHOT จะเป็นรุ่นก่อนวางจำหน่าย: " รุ่นก่อนวางจำหน่ายบ่งชี้ว่ารุ่นนั้นไม่เสถียรและอาจไม่เป็นไปตามข้อกำหนดความเข้ากันได้ตามที่ตั้งใจโดยแสดงโดยรุ่นปกติที่เกี่ยวข้องตัวอย่าง: 1.0.0 -alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92. "
avandeursen

3
ฟังดูแล้วเหมือน "SNAPSHOT" ไม่ใช่ "ภาพรวมของรหัสของคุณในเวลาที่กำหนด" แต่เป็น "รุ่นต่อไปของรหัสที่มีให้" ถ้านี่คือ HTTP มันจะเป็นธงที่บอกว่า "อย่าไปสนใจ HEAD ไปเอาทุกอย่างที่อยู่บนเซิร์ฟเวอร์ไปก่อน" อันที่จริงแล้วมันเกือบจะเป็น "รหัสตรงข้ามในเวลาที่กำหนด"
lilbyrdie

การพัฒนา "หนัก" คืออะไร?
โจ๊กเกอร์

1
@ โจ๊กเกอร์ "หนัก" คือเมื่อสิ่งต่าง ๆ กำลังเปลี่ยนแปลง (ฟีเจอร์ใหม่, การปรับโครงสร้างใหม่)
robert

28

"รีลีส" เป็นโครงสร้างสุดท้ายสำหรับเวอร์ชันที่ไม่เปลี่ยนแปลง

"ภาพรวม" เป็นงานสร้างที่สามารถแทนที่ได้ด้วยงานสร้างอื่นที่มีชื่อเดียวกัน มันก็หมายความว่าการสร้างสามารถเปลี่ยนแปลงได้ตลอดเวลาและยังอยู่ภายใต้การพัฒนาที่ใช้งานอยู่

คุณมีสิ่งประดิษฐ์ที่แตกต่างกันสำหรับการสร้างที่แตกต่างกันขึ้นอยู่กับรหัสเดียวกัน เช่นคุณอาจมีอันเดียวที่มีการดีบักและอีกอันที่ไม่มี หนึ่งสำหรับ Java 5.0 และอีกหนึ่งสำหรับ Java 6 โดยทั่วไปแล้วมันง่ายกว่าที่จะมีหนึ่งบิลด์ซึ่งทำทุกอย่างที่คุณต้องการ ;)


21

เวอร์ชัน Maven สามารถมีสตริง "SNAPSHOT" ตามตัวอักษรเพื่อแสดงว่าโครงการอยู่ภายใต้การพัฒนาที่ใช้งานอยู่

ตัวอย่างเช่นหากโครงการของคุณมีรุ่น“ 1.0-SNAPSHOT” และคุณปรับใช้สิ่งประดิษฐ์ของโครงการนี้กับที่เก็บ Maven Maven จะขยายรุ่นนี้เป็น“ 1.0-20080207-230803-1” หากคุณต้องการปรับใช้การปล่อยที่ 11 : 08.00 น. วันที่ 7 กุมภาพันธ์ 2551 เวลา UTC กล่าวอีกนัยหนึ่งเมื่อคุณปรับใช้สแนปชอตคุณไม่ได้เผยแพร่ส่วนประกอบซอฟต์แวร์ คุณกำลังปล่อยสแนปชอตของส่วนประกอบในเวลาที่กำหนด

ดังนั้นเวอร์ชัน snapshot ส่วนใหญ่จะใช้สำหรับโครงการภายใต้การพัฒนาที่ใช้งานอยู่ หากโครงการของคุณขึ้นอยู่กับส่วนประกอบซอฟต์แวร์ที่อยู่ภายใต้การพัฒนาที่ใช้งานอยู่คุณสามารถพึ่งพาสแน็ปช็อตได้และ Maven จะพยายามดาวน์โหลดสแน็ปช็อตล่าสุดจากที่เก็บเป็นระยะเมื่อคุณเรียกใช้บิลด์ ในทำนองเดียวกันหากรุ่นถัดไปของระบบของคุณจะมีเวอร์ชัน“ 1.8” โปรเจ็กต์ของคุณจะมีเวอร์ชัน“ 1.8-SNAPSHOT” จนกว่าจะมีการเปิดตัวอย่างเป็นทางการ

ตัวอย่างเช่นการพึ่งพาต่อไปนี้จะดาวน์โหลด 1.8 JAR การพัฒนาล่าสุดของฤดูใบไม้ผลิเสมอ:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>1.8-SNAPSHOT”</version>
    </dependency>

Maven

ตัวอย่างของกระบวนการปล่อย maven

ป้อนคำอธิบายรูปภาพที่นี่


6

ฉันต้องการที่จะทำให้จุดเกี่ยวกับคำศัพท์ คำตอบอื่น ๆ ให้คำอธิบายที่ดีเกี่ยวกับสิ่งที่รุ่น "ภาพรวม" ในบริบทของ Maven แต่เป็นไปตามที่เวอร์ชันที่ไม่ใช่สแน็ปช็อตควรเรียกว่ารุ่น "release" หรือไม่

มีความตึงเครียดระหว่างความคิดเวอร์ชันความหมายของ "การเปิดตัวรุ่น" ซึ่งดูเหมือนจะเป็นรุ่นใด ๆ ที่ไม่ได้มีการคัดเลือกเช่นเป็น-SNAPSHOTแต่ยังไม่ได้มีการคัดเลือกเช่น-beta.4; และความคิดความคิดของ Maven ของ "ปล่อย" -SNAPSHOTรุ่นซึ่งดูเหมือนว่าจะรวมถึงตัวตนของ

กล่าวอีกนัยหนึ่งมีความคลุมเครือทางความหมายว่า "ปล่อย" หมายถึง "เราสามารถปล่อยให้ Maven Central" หรือ "ซอฟต์แวร์อยู่ในรุ่นสุดท้ายที่เผยแพร่สู่สาธารณะ" เราสามารถพิจารณา-beta.4ให้เป็นรุ่น "ปล่อย" ถ้าเราปล่อยสู่สาธารณะ แต่ไม่ใช่ "รุ่นสุดท้าย" การกำหนดเวอร์ชันแบบ Semanticชัดเจนว่าบางสิ่งที่เหมือน-beta.4เป็นรุ่น "รุ่นก่อนวางจำหน่าย" ดังนั้นจึงไม่มีเหตุผลที่จะเรียกว่ารุ่น "รุ่น" แม้จะไม่มี-SNAPSHOTก็ตาม ในความเป็นจริงตามคำนิยามแม้-rc.5จะเป็นผู้สมัครรุ่นไม่ได้เป็นรุ่นจริงแม้ว่าเราอาจอนุญาตให้ประชาชนเข้าถึงการทดสอบ

ดังนั้น Maven แต่อย่างไรก็ตามในความคิดของฉันมันดูเหมือนว่าเหมาะสมเท่านั้นที่จะเรียกว่า "การเปิดตัว" รุ่นหนึ่งที่ไม่ได้มีการคัดเลือกใด ๆ -beta.4ที่ทุกคนไม่ได้ บางทีอาจจะเป็นชื่อที่ดีกว่าสำหรับรุ่นที่ไม่ใช่ภาพรวม Maven จะเป็น "มีเสถียรภาพ" รุ่น (แรงบันดาลใจจากคำตอบอื่น ) ดังนั้นเราจะมี:

  • 1.2.3-beta.4-SNAPSHOT: เวอร์ชันสแน็ปช็อตของเวอร์ชันก่อนวางจำหน่าย
  • 1.2.3-SNAPSHOT: เวอร์ชันสแน็ปช็อตของเวอร์ชันที่วางจำหน่าย
  • 1.2.3-beta.4: รุ่นเสถียรของรุ่นก่อนวางจำหน่าย
  • 1.2.3: รุ่นที่วางจำหน่าย (ซึ่งเป็นรุ่นที่เสถียรและไม่ใช่สแนปช็อตอย่างเห็นได้ชัด)

คุณมีข้อมูลใด ๆ เกี่ยวกับวิธีจัดการกับข้อมูลเมตาของบิวด์หรืออนุสัญญาการตั้งชื่อก่อนเผยแพร่อย่างไร ฉันหมายความว่าเราทุกคนรู้ว่าอัลฟ่านำหน้ารุ่นเบต้า แต่มนุษย์รู้หรือไม่? แม้ว่าจะใช้ 1.2.3-beta.4 เป็นรุ่นที่เสถียร แต่อย่างน้อยก็รู้ว่า 1.2.3 นั้นเป็นหลังจากนั้นหรือไม่
DGoiko

5

นี่เป็นภาพรวมของที่เก็บและในกรณีนี้ไม่ได้เปิดใช้งานซึ่งหมายความว่าที่เก็บที่อ้างถึงในที่นี้มีความเสถียรและไม่จำเป็นต้องมีการอัปเดต

<project>
    ...
    <repositories>
        <repository>
            <id>lds-main</id>
            <name>LDS Main Repo</name>
            <url>http://code.lds.org/nexus/content/groups/main-repo</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

กรณีอื่นจะเป็น:

<snapshots>
        <enabled>true</enabled>
</snapshots>

ซึ่งหมายความว่า Maven จะค้นหาการปรับปรุงสำหรับพื้นที่เก็บข้อมูลนี้ คุณยังสามารถระบุช่วงเวลาสำหรับการอัพเดตด้วยแท็ก


5

โดยปกติแล้วใน maven เรามีบิลด์สองประเภท 1) สแน็ปช็อตบิลด์ 2) บิลด์ builds

  1. การสร้าง snapshot: SNAPSHOT เป็นเวอร์ชันพิเศษที่ระบุว่าสำเนาการปรับใช้ปัจจุบันไม่เหมือนรุ่นทั่วไป maven ตรวจสอบเวอร์ชันสำหรับทุกบิลด์ในที่เก็บระยะไกลเพื่อให้สแน็ปช็อตบิลด์นั้นไม่มีอะไรนอกจากการสร้างการพัฒนา

  2. Release builds: Release หมายถึงการลบ SNAPSHOT ที่เวอร์ชันของบิลด์ซึ่งเป็นเวอร์ชันบิลด์ปกติ


3

เพียงภาพรวมหมายความว่าเป็นรุ่นที่ไม่มั่นคงอย่างใดอย่างหนึ่ง

เมื่อเวอร์ชันมีสแน็ปช็อตเช่น 1.0.0 -SNAPSHOT หมายความว่าเวอร์ชันไม่เสถียรและค้นหาที่เก็บรีโมตเพื่อแก้ไขการพึ่งพา


1

การเข้าใจบริบทของ SDLC จะช่วยให้เข้าใจความแตกต่างระหว่างสแน็ปช็อตและการเปิดตัว ในระหว่างการพัฒนากระบวนการ dev ทั้งหมดสนับสนุนคุณลักษณะของพวกเขาไปยังสาขาพื้นฐาน เมื่อถึงจุดหนึ่งหัวหน้าทีมคิดว่ามีคุณสมบัติเพียงพอที่จะสะสมจากนั้นเขาก็จะตัดกิ่งที่วางจำหน่ายจากกิ่งพื้นฐาน บิลด์ใด ๆ ก่อนหน้าจุดนี้คือสแน็ปช็อต บิลด์ที่โพสต์ถึงจุดนี้คือรีลีส จะสังเกตได้ว่าการวางจำหน่ายรุ่นนั้นอาจเปลี่ยนแปลงได้เช่นกันก่อนการผลิตหากมีจุดบกพร่องในระหว่างการทดสอบรุ่น


1

Snapshot หมายถึงว่าขึ้นอยู่กับการกำหนดค่าของคุณ Maven จะตรวจสอบการเปลี่ยนแปลงล่าสุดในการพึ่งพาพิเศษ Snapshot ไม่เสถียรเนื่องจากอยู่ระหว่างการพัฒนา แต่หากในโครงการพิเศษต้องมีการเปลี่ยนแปลงล่าสุดคุณต้องกำหนดค่าเวอร์ชันการพึ่งพาของคุณเป็นเวอร์ชันสแนปชอต สถานการณ์นี้เกิดขึ้นในองค์กรขนาดใหญ่ที่มีผลิตภัณฑ์หลากหลายซึ่งผลิตภัณฑ์เหล่านี้เกี่ยวข้องกันอย่างใกล้ชิด


0

สแน็ปช็อตหมายถึงสถานะของโครงการและการอ้างอิงในช่วงเวลานั้น เมื่อใดก็ตามที่ maven ค้นหา SNAPSHOT ที่ใหม่กว่าของโปรเจ็กต์มันจะดาวน์โหลดและแทนที่ไฟล์. jar เก่ากว่าของโปรเจ็กต์ในที่เก็บโลคัล

เวอร์ชัน Snapshot ใช้สำหรับโครงการภายใต้การพัฒนาที่ใช้งานอยู่ หากโครงการของคุณขึ้นอยู่กับส่วนประกอบซอฟต์แวร์ที่อยู่ภายใต้การพัฒนาที่ใช้งานอยู่คุณสามารถพึ่งพาสแน็ปช็อตได้และ Maven จะพยายามดาวน์โหลดสแน็ปช็อตล่าสุดจากที่เก็บเป็นระยะเมื่อคุณเรียกใช้บิลด์

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