หมายเหตุ: คำถามของฉันมุ่งเน้นที่ปัญหาเฉพาะของฉัน (ซึ่งเกี่ยวข้องกับ Liferay) แต่ฉันหวังว่ามันจะมีประโยชน์สำหรับทุกคนที่ต้องการบำรุงรักษาโครงการเดียวกันในคอมไพล์รุ่นต่างๆ
ผมทำงานใน บริษัท ที่เขียนจำนวนมากของปลั๊กอินสำหรับLiferay พอร์ทัล ปลั๊กอินเหล่านี้ (พอร์ตเล็ต, ธีม ฯลฯ ) โดยปกติจะสามารถใช้ซ้ำได้และแน่นอนควรได้รับการอัปเดตสำหรับพอร์ทัลเวอร์ชันใหม่
อย่างไรก็ตามเป็นเรื่องปกติที่จะต้องย้ายข้อมูลให้เราบอกว่าพอร์ตเล็ตเป็นเวอร์ชันใหม่ของ Liferay และเพื่อรักษาเวอร์ชันก่อนหน้า นอกจากนี้บ่อยครั้งที่เราต้องสร้างการปรับแต่งที่เฉพาะเจาะจงมากสำหรับลูกค้าบางรายซึ่งไม่สมเหตุสมผลที่จะเพิ่มใน "เวอร์ชันหลัก"
ข้อกำหนดเหล่านี้ทำให้งานของเราซับซ้อน แต่โชคดีที่เราสามารถสันนิษฐานได้ว่ามีความเรียบง่าย ตัวอย่างเช่นปลั๊กอินมีการอัปเดตบ่อยครั้งโดยโปรแกรมเมอร์เพียงหนึ่งคนในแต่ละครั้ง มันเป็นเรื่องยากมากที่จะมีการเพิ่มคุณสมบัติสองอย่างขึ้นไปในปลั๊กอินในเวลาเดียวกัน
ขณะนี้เรากำลังย้ายไปGitorious เราพยายามที่จะเข้าใจรูปแบบการแตกแขนงสำหรับสถานการณ์ดังกล่าว
โมเดลของฉัน
สิ่งที่ฉันเสนอคือ:
- แต่ละปลั๊กอินจะมีพื้นที่เก็บข้อมูลของตัวเองใน Gitorious ภายในโครงการ ตัวอย่างเช่นพอร์ตเล็ตสำหรับแสดงลูกแมวจะมี
kittens-portlet
พื้นที่เก็บข้อมูลภายในliferay-portlets
โครงการ - เมื่อสร้างปลั๊กอินใหม่ให้สร้างขึ้นที่สาขาที่มีชื่อตามเวอร์ชัน Liferay (ตัวอย่างเช่น
lf5.2
) - ทุกครั้งที่มีการปรับปรุงจะทำบนปลั๊กอิน, อัพเดทได้รับการอนุมัติและนำไปใช้ในการผลิต, การติดแท็กปลั๊กอินที่มีรุ่น (ตัวอย่างเช่น
lf5.2v1
,lf5.2v2
ฯลฯ .) * - ทุกครั้งที่มีการย้ายปลั๊กอินไปยัง Liferay เวอร์ชันใหม่เราจะทำการแยกสาขาเวอร์ชันล่าสุด (การสร้างเช่นสาขา
lf6.0
) lf6.0v1
เมื่อในการผลิตหัวของสาขาใหม่จะได้รับแท็กเช่น- ทุกครั้งที่เราต้องปรับแต่งปลั๊กอินในแบบเฉพาะลูกค้าเราสร้างสาขาที่มีชื่อลูกค้า (ตัวอย่างเช่นเราจะสร้างสาขา
lf5.2clientcorp
สำหรับลูกค้าของเรา "ClientCorp Inc. ")
นี่เป็นรูปแบบที่ผิดปกติ: มันจะไม่มีสาขาmaster
และไม่รวมสาขาจำนวนมาก นี่คือวิธีที่ฉันคิดว่าที่เก็บที่มีรูปแบบดังกล่าวจะมีลักษณะดังนี้:
เพื่อนพบว่าระบบนี้ค่อนข้างซับซ้อนและผิดพลาดได้ง่าย เขาแนะนำแบบจำลอง Vincent Driessen ที่ยอดเยี่ยมและเป็นที่นิยมซึ่งฉันพบว่ายังยากที่จะจัดการและเรียกร้องให้มีวินัย แน่นอนว่ามันยอดเยี่ยม (และผ่านการทดสอบ!) แต่ดูเหมือนจะซับซ้อนเกินไปสำหรับสถานการณ์ของเรา
แบบจำลองของเพื่อนฉัน
จากนั้นเขาแนะนำโมเดลอื่น: เราจะมีที่เก็บสำหรับปลั๊กอินแต่ละอันในเวอร์ชัน Liferay (ดังนั้นเราจะเริ่มสร้าง a kittens-lf5.2-portlet
และจากนั้น a kittens-lf6.0-portlet
) แต่ละอันมีmaster
สาขาและdevelop
สาขา master
จะพร้อมเสมอสำหรับการใช้งาน (หรืออาจเป็นวิธีอื่น ๆmaster
และstable
ตามที่Steve Losh แนะนำ )
มันง่ายมาก แต่ฉันไม่ชอบระบบนี้:
- มันอาจส่งผลให้มีแหล่งเก็บข้อมูลจำนวนมากในโครงการทำให้ Gitorious ยากต่อการเรียกดู
- ชื่อของไดเรกทอรีของโครงการนั้นเกี่ยวข้อง หากมีคนโคลนที่เก็บไปยัง
kittens-lf6.0-portlet
dir และสร้าง WAR ด้วย ant (ตามปกติ) ชื่อ WAR ก็จะkittens-lf6.0-portlet
เหมือนกัน เวอร์ชันเก่าของพอร์ตเล็ตนี้ (ชื่อkittens-portlet
ตัวอย่าง) จะถือว่าเป็นพอร์ตเล็ตอื่น (และอาจหายไป) ในพอร์ทัลที่อัปเกรด การดูแลเล็กน้อยสามารถหลีกเลี่ยงได้ แต่ฉันต้องการหลีกเลี่ยง - ปลั๊กอินรุ่นเดียวกันจะถูกแยกออกจากกัน ฉันทำลายหัวใจของฉัน :(
kittens-lf6.0-portlet
ฉันคิดว่าเป็นชื่อที่น่าเกลียดสำหรับที่เก็บ
ฉันสงสัยว่าทั้งสองประเด็นสุดท้าย - ซึ่งเป็นอีกสองประเด็นส่วนตัวเช่นกัน - เป็นเหตุผลหลักสำหรับความไม่เต็มใจของฉัน อย่างไรก็ตามการคัดค้านทั้งสี่ยืน
OTOH ข้อเสนอของฉันดูเหมือนจะแปลกสำหรับฉันและฉันสงสัยว่ามีข้อบกพร่องซ่อนเร้นอยู่หรือไม่ OT3rdH git นั้นทรงพลังและยืดหยุ่นมากซึ่งฉันคิดว่าฉันไม่ควรรู้สึกละอายกับการสำรวจความเป็นไปได้ของมัน
ดังนั้นฉันถาม:
- อะไรจะเป็นรูปแบบที่ดีที่สุด ข้อเสนอของฉัน? แบบจำลองของเพื่อนฉัน ระบบ Vincent Driessen ดั้งเดิมตอนนี้
- คุณจะแนะนำรูปแบบการแยกสาขาอื่นใด
- หากคุณคิดว่าแบบจำลองของฉันไม่ดีทำไมคุณคิดเช่นนั้น ฉันชอบที่จะเรียนรู้สิ่งที่เป็นข้อเสียและจุดบอด
* จริง ๆ แล้วฉันต้องการติดแท็กคอมมิทด้วยเวอร์ชันเช่นv1
แต่เห็นได้ชัดว่าแท็กในคอมไพล์ไม่ได้ถูกกำหนดขอบเขตในสาขา - นั่นคือฉันไม่สามารถมี 1 v1
แท็กในlf5.2
และอีกแท็กอินlf6.0
- ดังนั้นฉันต้องตั้งชื่อ สาขา. มันถูกต้อง BTW?