ฉันสับสนเล็กน้อยเกี่ยวกับความหมายของ Maven Snapshot และทำไมเราสร้างมันขึ้นมา?
ฉันสับสนเล็กน้อยเกี่ยวกับความหมายของ Maven Snapshot และทำไมเราสร้างมันขึ้นมา?
คำตอบ:
เวอร์ชันสแน็ปช็อตใน Maven เป็นเวอร์ชันที่ยังไม่ได้เผยแพร่
แนวคิดก็คือว่าก่อน1.0
ปล่อย (หรือปล่อยอื่น ๆ ) 1.0-SNAPSHOT
จะทำมีอยู่ ว่ารุ่นคือสิ่งที่อาจจะกลายเป็น 1.0
มันคือ " 1.0
กำลังพัฒนา" โดยทั่วไป นี่อาจใกล้เคียงกับรี1.0
ลีสจริงหรือค่อนข้างไกล (เช่นหลังจากรี0.9
ลีส)
ความแตกต่างระหว่างเวอร์ชัน "ของจริง" และเวอร์ชันของสแน็ปช็อตคือสแน็ปช็อตอาจได้รับการอัพเดต นั่นหมายความว่าการดาวน์โหลด1.0-SNAPSHOT
วันนี้อาจให้ไฟล์ที่แตกต่างจากการดาวน์โหลดเมื่อวานนี้หรือพรุ่งนี้
โดยปกติแล้วการพึ่งพาสแน็ปช็อตควรมีอยู่ในระหว่างการพัฒนาเท่านั้นและไม่มีเวอร์ชันที่วางจำหน่าย
1.0-DEVELOPMENT
" หรือชอบ " 1.0-INPROGRESS
" ทำไมผู้คนต้องใช้คำที่ไม่ชัดเจน
คำตอบอื่น ๆ อีกสามคำจะช่วยให้คุณมีวิสัยทัศน์ที่ดีว่า-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
:
SNAPSHOT
เวอร์ชันจะถูกจัดการเป็นไลบรารีที่มีเสถียรภาพ(รุ่นของ settings.xml สามารถดูได้ที่นี่)
mvn install
ไปติดตั้ง jar เวอร์ชัน 1.0-SNAPSHOT ลงใน repo ในพื้นที่ของฉัน ในวันถัดไปฉันทำการเปลี่ยนแปลงโครงการ แต่ไม่ได้เปลี่ยนรุ่น - จากนั้นเมื่อเรียกใช้mvn install
ดูเหมือนจะไม่เปลี่ยนใน repo ท้องถิ่นของฉัน นั่นเป็นพฤติกรรมที่คาดหวังหรือไม่? ฉันไม่สามารถใช้เวอร์ชันใหม่และเขียนทับมันด้วยmvn install
หลังจากทำการเปลี่ยนแปลงได้หรือไม่?
คำว่า "SNAPSHOT" หมายความว่าบิลด์เป็นสแน็ปช็อตของโค้ดในเวลาที่กำหนด
มันมักจะหมายความว่ารุ่นนี้ยังอยู่ภายใต้การพัฒนาอย่างมาก
เมื่อรหัสพร้อมใช้งานและถึงเวลาที่จะเผยแพร่คุณจะต้องเปลี่ยนรุ่นที่ระบุไว้ใน POM จากนั้นแทนที่จะมี "SNAPSHOT" คุณจะต้องใช้ป้ายกำกับเช่น "1.0"
สำหรับความช่วยเหลือบางอย่างกับเวอร์ชันตรวจสอบสเปครุ่นความหมาย
"รีลีส" เป็นโครงสร้างสุดท้ายสำหรับเวอร์ชันที่ไม่เปลี่ยนแปลง
"ภาพรวม" เป็นงานสร้างที่สามารถแทนที่ได้ด้วยงานสร้างอื่นที่มีชื่อเดียวกัน มันก็หมายความว่าการสร้างสามารถเปลี่ยนแปลงได้ตลอดเวลาและยังอยู่ภายใต้การพัฒนาที่ใช้งานอยู่
คุณมีสิ่งประดิษฐ์ที่แตกต่างกันสำหรับการสร้างที่แตกต่างกันขึ้นอยู่กับรหัสเดียวกัน เช่นคุณอาจมีอันเดียวที่มีการดีบักและอีกอันที่ไม่มี หนึ่งสำหรับ Java 5.0 และอีกหนึ่งสำหรับ Java 6 โดยทั่วไปแล้วมันง่ายกว่าที่จะมีหนึ่งบิลด์ซึ่งทำทุกอย่างที่คุณต้องการ ;)
เวอร์ชัน 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 แต่เป็นไปตามที่เวอร์ชันที่ไม่ใช่สแน็ปช็อตควรเรียกว่ารุ่น "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
: รุ่นที่วางจำหน่าย (ซึ่งเป็นรุ่นที่เสถียรและไม่ใช่สแนปช็อตอย่างเห็นได้ชัด)นี่เป็นภาพรวมของที่เก็บและในกรณีนี้ไม่ได้เปิดใช้งานซึ่งหมายความว่าที่เก็บที่อ้างถึงในที่นี้มีความเสถียรและไม่จำเป็นต้องมีการอัปเดต
<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 จะค้นหาการปรับปรุงสำหรับพื้นที่เก็บข้อมูลนี้ คุณยังสามารถระบุช่วงเวลาสำหรับการอัพเดตด้วยแท็ก
โดยปกติแล้วใน maven เรามีบิลด์สองประเภท 1) สแน็ปช็อตบิลด์ 2) บิลด์ builds
การสร้าง snapshot: SNAPSHOT เป็นเวอร์ชันพิเศษที่ระบุว่าสำเนาการปรับใช้ปัจจุบันไม่เหมือนรุ่นทั่วไป maven ตรวจสอบเวอร์ชันสำหรับทุกบิลด์ในที่เก็บระยะไกลเพื่อให้สแน็ปช็อตบิลด์นั้นไม่มีอะไรนอกจากการสร้างการพัฒนา
Release builds: Release หมายถึงการลบ SNAPSHOT ที่เวอร์ชันของบิลด์ซึ่งเป็นเวอร์ชันบิลด์ปกติ
เพียงภาพรวมหมายความว่าเป็นรุ่นที่ไม่มั่นคงอย่างใดอย่างหนึ่ง
เมื่อเวอร์ชันมีสแน็ปช็อตเช่น 1.0.0 -SNAPSHOT หมายความว่าเวอร์ชันไม่เสถียรและค้นหาที่เก็บรีโมตเพื่อแก้ไขการพึ่งพา
การเข้าใจบริบทของ SDLC จะช่วยให้เข้าใจความแตกต่างระหว่างสแน็ปช็อตและการเปิดตัว ในระหว่างการพัฒนากระบวนการ dev ทั้งหมดสนับสนุนคุณลักษณะของพวกเขาไปยังสาขาพื้นฐาน เมื่อถึงจุดหนึ่งหัวหน้าทีมคิดว่ามีคุณสมบัติเพียงพอที่จะสะสมจากนั้นเขาก็จะตัดกิ่งที่วางจำหน่ายจากกิ่งพื้นฐาน บิลด์ใด ๆ ก่อนหน้าจุดนี้คือสแน็ปช็อต บิลด์ที่โพสต์ถึงจุดนี้คือรีลีส จะสังเกตได้ว่าการวางจำหน่ายรุ่นนั้นอาจเปลี่ยนแปลงได้เช่นกันก่อนการผลิตหากมีจุดบกพร่องในระหว่างการทดสอบรุ่น
Snapshot หมายถึงว่าขึ้นอยู่กับการกำหนดค่าของคุณ Maven จะตรวจสอบการเปลี่ยนแปลงล่าสุดในการพึ่งพาพิเศษ Snapshot ไม่เสถียรเนื่องจากอยู่ระหว่างการพัฒนา แต่หากในโครงการพิเศษต้องมีการเปลี่ยนแปลงล่าสุดคุณต้องกำหนดค่าเวอร์ชันการพึ่งพาของคุณเป็นเวอร์ชันสแนปชอต สถานการณ์นี้เกิดขึ้นในองค์กรขนาดใหญ่ที่มีผลิตภัณฑ์หลากหลายซึ่งผลิตภัณฑ์เหล่านี้เกี่ยวข้องกันอย่างใกล้ชิด
สแน็ปช็อตหมายถึงสถานะของโครงการและการอ้างอิงในช่วงเวลานั้น เมื่อใดก็ตามที่ maven ค้นหา SNAPSHOT ที่ใหม่กว่าของโปรเจ็กต์มันจะดาวน์โหลดและแทนที่ไฟล์. jar เก่ากว่าของโปรเจ็กต์ในที่เก็บโลคัล
เวอร์ชัน Snapshot ใช้สำหรับโครงการภายใต้การพัฒนาที่ใช้งานอยู่ หากโครงการของคุณขึ้นอยู่กับส่วนประกอบซอฟต์แวร์ที่อยู่ภายใต้การพัฒนาที่ใช้งานอยู่คุณสามารถพึ่งพาสแน็ปช็อตได้และ Maven จะพยายามดาวน์โหลดสแน็ปช็อตล่าสุดจากที่เก็บเป็นระยะเมื่อคุณเรียกใช้บิลด์