ในคอมไพล์วิธีการกำหนดเวอร์ชันสำหรับไลบรารีโหลทั้งหมดนั้นทำงานพร้อมกัน


11

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

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

ปัญหาหลายอย่างที่เราต้องจัดการในโครงการต้องการให้เราทำการเปลี่ยนแปลงในหลาย ๆ ไลบรารีและรหัสเฉพาะของโครงการ สิ่งเหล่านี้มักจะรวมถึงการเปลี่ยนแปลงอินเทอร์เฟซของไลบรารีซึ่งบางอย่างไม่เข้ากัน (ถ้าคุณคิดว่ามันฟังดูแปลก ๆ : เราเชื่อมต่อกับฮาร์ดแวร์และซ่อนฮาร์ดแวร์ที่เฉพาะเจาะจงไว้ข้างหลังอินเตอร์เฟสทั่วไปเกือบทุกครั้งที่เรารวมฮาร์ดแวร์ของผู้ขายรายอื่นที่เราพบในกรณีที่อินเทอร์เฟซปัจจุบันของเราไม่ได้คาดหวัง ตัวอย่างเช่นสมมติว่าโครงการที่P1ใช้ห้องสมุดL1, และL2 ยังใช้และ, และใช้เช่นกัน กราฟการพึ่งพามีลักษณะดังนี้:L3L1L2L3L2L3

   <-------L1<--+
P1 <----+  ^    |
   <-+  |  |    |
     |  +--L2   |
     |     ^    |
     |     |    |
     +-----L3---+

ตอนนี้คิดคุณลักษณะสำหรับโครงการนี้ต้องมีการเปลี่ยนแปลงในP1และที่เปลี่ยนอินเตอร์เฟซของL3 L3ตอนนี้เพิ่มโปรเจ็กต์P2และP3ลงในแบบผสมซึ่งยังอ้างถึงไลบรารีเหล่านี้ เราไม่สามารถเปลี่ยนทุกสิ่งให้เป็นอินเทอร์เฟซใหม่ทำการทดสอบทั้งหมดและปรับใช้ซอฟต์แวร์ใหม่ ดังนั้นทางเลือกคืออะไร

  1. ใช้อินเทอร์เฟซใหม่ใน L3
  2. ทำการดึงL3และรอการตรวจสอบ
  3. ผสานการเปลี่ยนแปลง
  4. สร้างรุ่นใหม่ของ L3
  5. เริ่มทำงานกับคุณสมบัติP1โดยอ้างอิงจากรีL3ลีสใหม่แล้วนำฟีเจอร์นั้นไปใช้กับฟีเจอร์P1ของสาขา
  6. ทำให้คำขอดึงได้รับการตรวจสอบและผสาน

(ฉันเพิ่งสังเกตุว่าฉันลืมที่จะเปลี่ยนL1และL2เปิดตัวใหม่และฉันไม่รู้ด้วยซ้ำว่าจะติดตั้งที่ใดเพราะจะต้องทำควบคู่ไปกับP1... )

นี่เป็นกระบวนการที่น่าเบื่อข้อผิดพลาดและใช้เวลานานมากในการใช้งานคุณลักษณะนี้ต้องการการตรวจสอบที่เป็นอิสระ (ซึ่งทำให้ยากต่อการตรวจสอบ) ไม่ได้ปรับขนาดเลยและมีแนวโน้มที่จะนำเราออกจากธุรกิจเพราะเรา จมอยู่ในกระบวนการเราไม่เคยทำอะไรเลย

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


1
การเปลี่ยนเครื่องมือของคุณไม่ควรส่งผลกระทบต่อกระบวนการที่คุณมีมากเกินไป ดังนั้นคุณจัดการกับปัญหานี้อย่างไรก่อนที่คุณจะเปลี่ยนเป็นคอมไพล์?
Bart van Ingen Schenau

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

1
@Ixrec: ฉันบอกว่า "นี่ไม่ใช่วิธีคอมไพล์" ในการทำสิ่งต่าง ๆ ทุกคนใช้ที่เก็บข้อมูลส่วนบุคคลสำหรับแต่ละโครงการดังนั้นเราจึงตัดสินใจเช่นกัน
sbi

2
ฉันจะโต้แย้งว่าพวกเขาไม่ได้แยกโครงการถ้าพวกเขาต้องมีการเปลี่ยนแปลงควบคู่บ่อยครั้ง ขอบเขตระหว่าง "โครงการ" ควรมีการรับประกันความเข้ากันได้ย้อนหลังในระยะยาว
Ixrec

1
@Ixrec: การรวมฮาร์ดแวร์ให้มากขึ้นนั้นคล้ายคลึงกับการย้ายรหัสไปยังแพลตฟอร์มอื่น ๆ : ยิ่งคุณทำสิ่งนี้มากเท่าไหร่คุณก็ยิ่งต้องเปลี่ยนน้อยลงสำหรับฮาร์ดแวร์ / แพลตฟอร์มอื่น ดังนั้นในระยะยาวรหัสจะเสถียร อย่างไรก็ตามตอนนี้เราจะต้องหากระบวนการที่ทำให้เราอยู่ในตลาดนานพอที่จะไปถึงที่นั่น
sbi

คำตอบ:


5

ชนิดของการวางที่ชัดเจนที่นี่ แต่อาจจะพูดถึงมัน

โดยปกติแล้ว repos คอมไพล์ได้รับการปรับแต่งตาม lib / โครงการเพราะพวกเขามีแนวโน้มที่จะเป็นอิสระ คุณอัปเดตโครงการของคุณและไม่สนใจสิ่งที่เหลือ โครงการอื่น ๆ ขึ้นอยู่กับว่ามันจะอัพเดท lib ของพวกเขาทุกครั้งที่เห็นว่าเหมาะสม

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

มีข้อดี / ข้อเสียที่แข็งแกร่งในการนี้

ข้อดี:

  • Tracability: สาขาแสดงทุกสิ่งที่เปลี่ยนแปลงในทุกโครงการ / lib ที่เกี่ยวข้องกับคุณสมบัติ / ข้อผิดพลาดนี้
  • Bundling: เพียงแค่เลือกแท็กและคุณจะได้รับแหล่งข้อมูลทั้งหมดที่ถูกต้อง

ข้อเสีย:

  • การผสาน: ... บางครั้งมันก็ยากด้วยโครงการเดียว เมื่อทีมต่าง ๆ ที่ทำงานในสาขาที่ใช้ร่วมกันต้องเตรียมพร้อมรับผลกระทบ
  • อันตราย "โอ๊ะ" ปัจจัยถ้า messes พนักงานหนึ่งขึ้นพื้นที่เก็บข้อมูลโดยการทำผิดพลาดบางอย่างก็อาจจะส่งผลกระทบต่อทุกโครงการและทีมงาน

ขึ้นอยู่กับคุณที่จะรู้ว่าราคาคุ้มค่าหรือไม่

แก้ไข:

มันจะทำงานเช่นนี้:

  • ต้องใช้คุณสมบัติ X
  • สร้างสาขา feature_x
  • นักพัฒนาทั้งหมดเกี่ยวข้องกับการทำงานในสาขานี้และทำงานเป็นคู่ขนานกับมันอาจอยู่ในไดเรกทอรีเฉพาะที่เกี่ยวข้องกับโครงการ / lib ของพวกเขา
  • เมื่อเสร็จแล้วให้ตรวจสอบทดสอบบรรจุภัณฑ์อะไรก็ได้
  • รวมมันกลับเข้าที่ในหลัก ... และนี่อาจเป็นส่วนที่ยากลำบากตั้งแต่ในระหว่างนี้feature_yและfeature_zอาจถูกเพิ่มเข้ามาด้วย มันกลายเป็น "การรวมข้ามทีม" นี่คือเหตุผลที่มันเป็นข้อเสียเปรียบอย่างรุนแรง

สำหรับบันทึก: ฉันคิดว่านี่เป็นความคิดที่ไม่ดีและควรทำอย่างระมัดระวังเพราะข้อเสียเปรียบผสานมักจะสูงกว่าที่คุณได้รับจากการจัดการการพึ่งพาอาศัย / การติดตามคุณสมบัติที่เหมาะสม


ขอบคุณเรากำลังดูเรื่องนี้อยู่ สิ่งที่ฉันไม่เข้าใจในเรื่องนี้คือวิธีที่เราแยกสาขาด้วย git ใน SVN การแยกย่อยหมายถึงการคัดลอกทรีย่อย (ในที่เก็บ) ไปยังที่อื่น (ในที่เก็บ) ด้วยวิธีนี้มันเป็นเรื่องง่ายที่จะสร้างสาขาย่อยของทรีย่อยใน repo ของคุณดังนั้นหากคุณมีหลายโครงการในนั้นคุณสามารถแยกแต่ละสาขาย่อยได้ มีอะไรแบบนี้ในคอมไพล์หรือเราจะสามารถแยก repo ทั้งหมดได้หรือไม่?
sbi

@sbi: คุณจะแยกสาขา repo ทั้งหมด คุณไม่สามารถทำงานกับ subtrees ในสาขาต่าง ๆ ซึ่งจะเอาชนะประเด็นในกรณีของคุณ Git จะไม่ "คัดลอก" อะไรเลยมันจะติดตามการเปลี่ยนแปลงในสาขาที่คุณกำลังทำอยู่
dagnelies

ดังนั้นสิ่งนี้ต้องการใครสักคนที่สร้างสาขาฟีเจอร์สำหรับหนึ่งไลบรารีเพื่อรวมคนอื่น ๆ ทั้งหมดเมื่อรวมหรือรีบูต นี่คือข้อเสียเปรียบจริง (BTW, SVN นอกจากนี้ยังไม่เคยขี้เกียจสำเนา.)
เอสบีไอ

@sbi: ดูการแก้ไข
dagnelies

1
ตอนนี้พวกเราส่วนใหญ่ไม่สะดวกสบาย :-/ยิ่งไปกว่านั้นแม้แต่คนที่เป็น (และผู้ที่ผลักดันให้ย้ายไปยังคอมไพล์) ก็ไม่รู้ว่าจะทำให้กระบวนการพัฒนาของเราสอดคล้องกับคอมไพล์ได้อย่างไร ถอนหายใจ มันจะเป็นเรื่องยากสักสองสามเดือนฉันกลัวจนกระทั่งสิ่งต่าง ๆ เริ่มราบรื่นขึ้น ขอบคุณอยู่ดีคุณเป็นคำตอบที่มีประโยชน์ที่สุดเท่านั้น
sbi

4

วิธีการแก้ปัญหาที่คุณกำลังมองหาคือเครื่องมือการจัดการการพึ่งพาในการประสานงานกับ submodules git

เครื่องมือเช่น:

  • Maven
  • มด
  • นักแต่งเพลง

คุณสามารถใช้เครื่องมือเหล่านั้นเพื่อกำหนดการพึ่งพาของโครงการ

คุณสามารถกำหนดให้ submodule เป็นเวอร์ชั่นอย่างน้อย> 2.xxหรือแสดงช่วงของรุ่นที่เข้ากันได้= 2.2. *หรือน้อยกว่าเวอร์ชันที่เฉพาะเจาะจง<2.2.3

เมื่อใดก็ตามที่คุณปล่อยเวอร์ชั่นใหม่ของแพ็คเกจใดแพ็คเกจหนึ่งคุณสามารถติดแท็กมันด้วยหมายเลขเวอร์ชันวิธีการที่คุณสามารถดึงรหัสรุ่นที่เฉพาะเจาะจงนั้นลงในโครงการอื่น ๆ ทั้งหมด


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

@sbi สิ่งนี้จะจัดการค่าใช้จ่ายในการสร้างเวอร์ชันใหม่และการรักษาโครงการที่มีเสถียรภาพ เนื่องจากคุณสามารถกำหนดโครงการ x ขึ้นอยู่กับโครงการ y เวอร์ชัน 2.1.1 คุณสามารถสร้างเวอร์ชันใหม่ของโครงการ y ที่จะไม่ส่งผลกระทบต่อโครงการ x
แพทริค

อีกครั้งการประกาศการพึ่งพาไม่ใช่ปัญหาของเรา เราสามารถทำสิ่งนี้ได้แล้ว ปัญหาคือวิธีจัดการการเปลี่ยนแปลงในหลาย ๆ โครงการ / ห้องสมุดอย่างมีประสิทธิภาพ คำตอบของคุณไม่สามารถอธิบายสิ่งนี้ได้
sbi

@sbi: แล้วปัญหาของคุณคืออะไร? คุณทำการเปลี่ยนแปลงชนรุ่นปรับปรุงการอ้างอิงตามที่ต้องการและ voila สิ่งที่คุณอธิบายไว้ในโพสต์เริ่มต้นของคุณคือ Maven & co สิ่ง การกระจายแต่ละครั้งจะขึ้นอยู่กับ libs ที่กำหนดไว้อย่างชัดเจน มันจะชัดเจนกว่านี้ได้อย่างไร?
dagnelies

@arnaud: เวลาตอบสนองสำหรับกระบวนการดังกล่าว (ปัจจุบันค่อนข้างบ่อย) การเปลี่ยนแปลงที่ตัดผ่านสามชั้นขึ้นไปจะฆ่าเรา ฉันคิดว่าคำถามของฉันอธิบายว่า
sbi

0

submodules

คุณควรจะลองgit submodulesตามที่แนะนำในความคิดเห็นเดียว

เมื่อโครงการP1หมายถึงสาม submodules L1, L2และL3ก็จริงเก็บการอ้างอิงถึงการกระทำโดยเฉพาะอย่างยิ่งในทั้งสามเก็บ: ผู้ที่มีการทำงานรุ่นของแต่ละห้องสมุดสำหรับโครงการที่

ดังนั้นหลายโครงการสามารถทำงานกับหลาย submodules: P1อาจหมายถึงไลบรารีเวอร์ชันเก่าL1ในขณะที่โครงการP2ใช้เวอร์ชันใหม่

เกิดอะไรขึ้นเมื่อคุณส่งรุ่นใหม่L3?

  • ใช้อินเทอร์เฟซใหม่ใน L3
  • ส่งทดสอบดึงคำขอตรวจทานรวม ... (คุณไม่สามารถหลีกเลี่ยงได้)
  • ตรวจสอบให้แน่ใจL2ทำงานร่วมกับL3กระทำ ...
  • ตรวจสอบให้แน่ใจว่าL1ทำงานกับใหม่L2...
  • ตรวจสอบให้แน่ใจว่าP1ทำงานกับเวอร์ชันใหม่ของไลบรารีทั้งหมด:
    • ภายในP1's สำเนาการทำงานของท้องถิ่นL1, L2และL3, fetche การเปลี่ยนแปลงที่คุณอยู่ในความสนใจ
    • กระทำการเปลี่ยนแปลงgit add L1 L2 L3เพื่อคอมมิชชันการอ้างอิงใหม่ไปยังโมดูล
    • ดึงคำขอP1ทดสอบตรวจสอบดึงคำขอผสาน ...

ระเบียบวิธี

นี่เป็นกระบวนการที่น่าเบื่อข้อผิดพลาดและใช้เวลานานมากในการใช้งานคุณลักษณะนี้ต้องการการตรวจสอบที่เป็นอิสระ (ซึ่งทำให้ยากต่อการตรวจสอบ) ไม่ได้ปรับขนาดเลยและมีแนวโน้มที่จะนำเราออกจากธุรกิจเพราะเรา จมอยู่ในกระบวนการเราไม่เคยทำอะไรเลย

ใช่มันต้องมีการตรวจสอบอิสระเพราะคุณเปลี่ยน:

  • ห้องสมุด
  • ห้องสมุดที่ขึ้นอยู่กับมัน
  • โครงการที่ขึ้นอยู่กับห้องสมุดหลายแห่ง

คุณจะเลิกกิจการเพราะคุณส่งอึหรือไม่? (อาจไม่จริง) ถ้าใช่คุณต้องทำการทดสอบและตรวจสอบการเปลี่ยนแปลง

ด้วยเครื่องมือ git ที่เหมาะสม (แม้gitk) คุณสามารถดูเวอร์ชันของไลบรารีที่ใช้ในแต่ละโครงการได้อย่างง่ายดายและคุณสามารถอัปเดตได้อย่างอิสระตามความต้องการของคุณ Submodules สมบูรณ์แบบสำหรับสถานการณ์ของคุณและจะไม่ทำให้กระบวนการของคุณช้าลง

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

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


คุณอธิบายถึงวิธีการแก้ปัญหาการพึ่งพา (ซึ่งอย่างที่ฉันได้กล่าวไว้ก่อนหน้านี้เราได้แยกออก) และปฏิเสธปัญหาที่เรามี ทำไมคุณถึงต้องใส่ใจ (FWIW เราเขียนซอฟต์แวร์ที่ขับเคลื่อนโรงไฟฟ้ารหัสสะอาดปลอดภัยและตรวจสอบอย่างละเอียดเป็นคุณสมบัติที่สำคัญ)
sbi

@sbi อะไรคือ submodules ถ้าไม่ใช่กรณีพิเศษของการแตกกิ่งและติดแท็ก? คุณคิดว่า submodules เกี่ยวกับการจัดการการพึ่งพาเพราะพวกเขายังติดตามการพึ่งพา แต่แน่นอนว่าโปรดรวมตัวใหม่ submodules ด้วยแท็กถ้าคุณต้องการฉันไม่รังเกียจ ฉันไม่เข้าใจปัญหาของคุณ: หากโค้ดที่ตรวจสอบแล้วเป็นคุณสมบัติที่สำคัญคุณต้องตั้งงบประมาณในการตรวจสอบ คุณจะไม่จมลงคุณไปเร็วที่สุดเท่าที่จะทำได้โดยมีข้อ จำกัด ที่ทำให้คุณ
coredump

ความคิดเห็นเป็นสิ่งสำคัญมากสำหรับเรา นั่นเป็นหนึ่งในเหตุผลที่เรากังวลเกี่ยวกับปัญหา (และบทวิจารณ์) ที่แยกออกเป็นบทวิจารณ์หลายรายการสำหรับการเปลี่ยนแปลงหลายครั้งในที่เก็บหลายแห่ง นอกจากนี้เราไม่ต้องการจมดิ่งลงในการบริหารจัดการเราจนตายในประเด็นหนึ่งคือเราต้องการใช้เวลาในการเขียนและตรวจสอบรหัส Re submodules: จนถึงตอนนี้สิ่งเดียวที่ฉันเคยได้ยินเกี่ยวกับพวกเขาคือ "ไม่รำคาญนี่ไม่ใช่วิธีคอมไพล์" เนื่องจากความต้องการของเราดูเหมือนจะไม่เหมือนใครบางทีเราควรกลับมาทบทวนการตัดสินใจครั้งนี้อีกครั้ง ...
sbi

0

สิ่งที่ฉันเข้าใจคือสำหรับ P1 คุณต้องการเปลี่ยนอินเตอร์เฟส L3 แต่คุณต้องการอีก P2 และ P3 ซึ่งขึ้นอยู่กับอินเตอร์เฟส L3 เพื่อเปลี่ยนทันที นี่เป็นกรณีทั่วไปของความเข้ากันได้แบบย้อนหลัง มีบทความที่ดีเกี่ยวกับการรักษาความเข้ากันได้แบบย้อนหลังนี้

มีหลายวิธีที่คุณสามารถแก้ปัญหานี้:

  • คุณต้องสร้างอินเทอร์เฟซใหม่ทุกครั้งที่สามารถขยายอินเทอร์เฟซเก่า

หรือ

  • ถ้าคุณต้องการปลดอินเทอร์เฟซเก่าหลังจากผ่านไประยะหนึ่งคุณสามารถมีอินเทอร์เฟซหลายเวอร์ชันและเมื่อโครงการที่เกี่ยวข้องทั้งหมดย้ายคุณจะลบอินเทอร์เฟซรุ่นเก่าออก

1
ไม่ความเข้ากันได้แบบย้อนหลังได้รับการรับรองผ่านสาขาการวางจำหน่ายและไม่ใช่ปัญหาของเรา ปัญหาคือเรานั่งอยู่บน codebase ที่เปลี่ยนแปลงอย่างรวดเร็วในปัจจุบันซึ่งเปียกชื้นต้องการแยกออกเป็นไลบรารี่ในขณะนี้แม้ว่าอินเทอร์เฟซยังอยู่ในช่วงที่พวกเขาเปลี่ยนบ่อย ฉันรู้วิธีจัดการสัตว์ร้ายใน SVN แต่ไม่รู้ว่าจะทำอย่างไรใน git โดยไม่จมน้ำตายในการบริหาร
sbi

0

หากฉันได้รับปัญหาของคุณถูกต้อง:

  • ของคุณมี 4 โมดูลที่เกี่ยวข้องระหว่าง P1 และ L1 ถึง L3
  • คุณต้องทำการเปลี่ยนแปลง P1 ซึ่งในที่สุดจะส่งผลต่อ L1 ถึง L3
  • มันนับว่าเป็นความล้มเหลวของกระบวนการถ้าคุณต้องเปลี่ยนทั้ง 4 ด้วยกัน
  • มันนับว่าเป็นความล้มเหลวของกระบวนการถ้าคุณต้องเปลี่ยนพวกเขาทั้งหมด 1 โดย 1
  • มันนับว่าเป็นความล้มเหลวของกระบวนการหากคุณต้องระบุชิ้นล่วงหน้าที่ต้องทำการเปลี่ยนแปลงล่วงหน้า

ดังนั้นเป้าหมายคือคุณสามารถทำ P1 และ L1 ได้ในครั้งเดียวและอีกหนึ่งเดือนต่อมาก็ทำ L2 และ L3 อีกครั้ง

ในโลกของ Java นี่เป็นเรื่องเล็กน้อยและอาจเป็นวิธีเริ่มต้นในการทำงาน:

  • ทุกอย่างไปในที่เก็บเดียวโดยไม่ต้องใช้การแยกสาขาที่เกี่ยวข้อง
  • โมดูลถูกคอมไพล์ + เชื่อมโยงเข้าด้วยกันโดย maven ตามหมายเลขเวอร์ชันไม่ใช่ความจริงที่ว่าทั้งหมดอยู่ในแผนผังไดเรกทอรีเดียวกัน

ดังนั้นคุณสามารถมีรหัสบนโลคัลดิสก์ของคุณสำหรับ L3 ที่จะไม่รวบรวมหากมันถูกรวบรวมเทียบกับสำเนาของ P1 ในไดเรกทอรีอื่นบนดิสก์ของคุณ โชคดีที่มันไม่ได้ทำเช่นนั้น Java สามารถทำสิ่งนี้ได้โดยตรงเนื่องจากการรวบรวม / เชื่อมโยงนิทานกับไฟล์ jar ที่คอมไพล์ไม่ใช่ซอร์สโค้ด

ฉันไม่ทราบวิธีแก้ปัญหาที่ใช้กันอย่างแพร่หลายในปัญหานี้สำหรับโลก C / C ++ และฉันคิดว่าคุณไม่ต้องการเปลี่ยนภาษา แต่บางสิ่งอาจถูกแฮ็กอย่างง่ายดายพร้อมกับสร้างไฟล์ที่ทำสิ่งที่เทียบเท่า:

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

คุณสามารถใช้การสนับสนุนC / C ++ ใน mavenแม้ว่านักพัฒนา C ส่วนใหญ่จะมองคุณแปลก ๆ ถ้าคุณทำ ...


"มันนับเป็นความล้มเหลวของกระบวนการถ้าคุณมีการเปลี่ยนแปลงทั้ง 4 ร่วมกัน" จริง ๆ แล้วมันจะไม่ ความจริงแล้วนี่คือสิ่งที่เราใช้กับ SVN
sbi

ในกรณีนี้ฉันเดาว่าจะไม่มีปัญหาเพียงแค่วางโครงการทั้งหมดลงในที่เก็บ
soru

ขณะนี้เรากำลังประเมินการวางไลบรารีลงในที่เก็บสองแห่งเท่านั้น ยังมีมากกว่าหนึ่ง แต่น้อยกว่า "หนึ่งสำหรับทุกโครงการ" และห้องสมุดสามารถแบ่งออกเป็นสองกลุ่มได้เป็นอย่างดี ขอบคุณสำหรับข้อมูลของคุณ!
sbi

PS: "ฉันคิดว่าคุณแทบจะไม่ต้องการเปลี่ยนภาษา" นี่คือสิ่งที่ฝังตัว :)
sbi

-1

มีวิธีแก้ปัญหาง่าย ๆ : ตัดกิ่งไม้ที่วางจำหน่ายทั่วพื้นที่เก็บข้อมูลทั้งหมดรวมการแก้ไขทั้งหมดไปยังทุกรุ่นที่มีการจัดส่งอย่างแข็งขัน (เป็นเรื่องง่ายในกรณีที่ชัดเจน

ทางเลือกทั้งหมดจะสร้างความยุ่งเหยิงที่น่ากลัวเมื่อเวลาผ่านไปและด้วยการเติบโตของโครงการ


คุณช่วยอธิบายรายละเอียดได้ไหม? ฉันไม่แน่ใจว่าคุณกำลังแนะนำอะไร
sbi

ในกรณีที่ชัดเจนคุณกำหนดสาขาจุดเป็นสาขาฐานและการประทับเวลา คุณมีลำดับชั้นดังต่อไปนี้: base branch -> release-development-branch -> branch-development private การพัฒนาทั้งหมดจะทำในสาขาเอกชนแล้วรวมลงในลำดับชั้น สาขาการเปิดตัวของลูกค้าจะแตกออกเป็นสาขาการพัฒนา ฉันไม่คุ้นเคยกับ git แต่ดูเหมือนว่าสิ่งที่ใกล้เคียงที่สุดในการล้างกรณีในระบบควบคุมแหล่งข้อมูลฟรี
zzz777

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

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