หากคุณทำตามคำแนะนำของฉันด้านล่าง (ฉันมีมาหลายปีแล้ว) คุณจะสามารถ:
- วางแต่ละโครงการไว้ที่ใดก็ได้ในการควบคุมแหล่งที่มาตราบเท่าที่คุณรักษาโครงสร้างจากไดเรกทอรีรากของโครงการ
- สร้างแต่ละโครงการได้ทุกที่บนเครื่องใดก็ได้โดยมีความเสี่ยงขั้นต่ำและการเตรียมขั้นต่ำ
- สร้างแต่ละโครงการแบบสแตนด์อะโลนโดยสมบูรณ์ตราบเท่าที่คุณสามารถเข้าถึงการอ้างอิงไบนารี (ไดเร็กทอรี "ไลบรารี" และ "เอาต์พุต" ในเครื่อง)
- สร้างและทำงานร่วมกับโครงการใด ๆ เนื่องจากเป็นอิสระ
- สร้างและทำงานกับหลายสำเนา / เวอร์ชันของโครงการเดียวเนื่องจากเป็นอิสระ
- หลีกเลี่ยงความยุ่งเหยิงที่เก็บข้อมูลการควบคุมซอร์สของคุณด้วยไฟล์หรือไลบรารีที่สร้างขึ้น
ฉันแนะนำ (นี่คือเนื้อวัว):
กำหนดแต่ละโปรเจ็กต์เพื่อสร้างการส่งมอบหลักรายการเดียวเช่น. DLL, .EXE หรือ. JAR (ค่าเริ่มต้นด้วย Visual Studio)
จัดโครงสร้างแต่ละโครงการเป็นแผนผังไดเร็กทอรีที่มีรูทเดียว
สร้างสคริปต์บิลด์อัตโนมัติสำหรับแต่ละโปรเจ็กต์ในไดเร็กทอรีรูทซึ่งจะสร้างตั้งแต่เริ่มต้นโดยไม่มีการพึ่งพา IDE (แต่อย่าป้องกันไม่ให้สร้างใน IDE หากเป็นไปได้)
พิจารณาโครงการ nAnt สำหรับ. NET บน Windows หรือสิ่งที่คล้ายกันตามระบบปฏิบัติการของคุณแพลตฟอร์มเป้าหมาย ฯลฯ
ทำให้ทุกโครงการบิวด์สคริปต์อ้างอิงการอ้างอิงภายนอก (ของบุคคลที่สาม) จากไดเร็กทอรี "ไลบรารี" ที่แบ่งใช้ภายในเครื่องเดียวโดยทุกไบนารีจะระบุตามเวอร์ชัน: %DirLibraryRoot%\ComponentA-1.2.3.4.dll
, %DirLibraryRoot%\ComponentB-5.6.7.8.dll
.
ทำให้ทุกโครงการสร้างสคริปต์เผยแพร่ส่งมอบหลักในท้องถิ่นร่วมกัน "ส่งออก" ไดเรกทอรีเดียว: ,%DirOutputRoot%\ProjectA-9.10.11.12.dll
%DirOutputRoot%\ProjectB-13.14.15.16.exe
ทำให้สคริปต์บิลด์โปรเจ็กต์ทุกรายการอ้างอิงการอ้างอิงผ่านพา ธ สัมบูรณ์ที่กำหนดค่าได้และเวอร์ชันเต็ม (ดูด้านบน) ในไดเร็กทอรี "ไลบรารี" และ "เอาต์พุต" และไม่ใช่ที่อื่น
อย่าให้โปรเจ็กต์อ้างอิงโปรเจ็กต์อื่นโดยตรงหรือเนื้อหาใด ๆ ของโปรเจ็กต์ - อนุญาตเฉพาะการอ้างอิงไปยังสิ่งที่ส่งมอบหลักในไดเร็กทอรี "เอาต์พุต" (ดูด้านบน)
ทำให้ทุกโครงการสร้างสคริปต์อ้างอิงเครื่องมือสร้างที่จำเป็นโดยเส้นทางสัมบูรณ์ที่กำหนดค่าได้และมีเวอร์ชันเต็ม: %DirToolRoot%\ToolA\1.2.3.4
, %DirToolRoot%\ToolB\5.6.7.8
.
สร้างเนื้อหาซอร์สการอ้างอิงสคริปต์บิลด์โปรเจ็กต์ทั้งหมดโดยพา ธ สัมบูรณ์ที่สัมพันธ์กับไดเร็กทอรีรูทของโปรเจ็กต์: ${project.base.dir}/src
, ${project.base.dir}/tst
(ไวยากรณ์แตกต่างกันไปตามเครื่องมือบิลด์)
มักจะต้องใช้สคริปต์สร้างโครงการเพื่ออ้างอิงทุกไฟล์หรือไดเร็กทอรีผ่านพา ธ ที่กำหนดค่าได้แน่นอน (รูทที่ไดเร็กทอรีที่ระบุโดยตัวแปรที่กำหนดค่าได้): ${project.base.dir}/some/dirs
หรือ${env.Variable}/other/dir
.
ไม่อนุญาตให้สคริปต์บิลด์โปรเจ็กต์อ้างอิงสิ่งใด ๆ ด้วยพา ธ สัมพัทธ์เช่น.\some\dirs\here
หรือ..\some\more\dirs
ใช้พา ธสัมบูรณ์เสมอ
ไม่อนุญาตให้โครงการสร้างสคริปต์อะไรอ้างอิงโดยใช้เส้นทางที่แน่นอนว่าไม่ได้มีการกำหนดค่าไดเรกทอรีรากเหมือนหรือC:\some\dirs\here
\\server\share\more\stuff\there
สำหรับไดเร็กทอรีรูทที่กำหนดค่าได้ซึ่งอ้างอิงโดยสคริปต์การสร้างโปรเจ็กต์ให้กำหนดตัวแปรสภาพแวดล้อมที่จะใช้สำหรับการอ้างอิงเหล่านั้น
พยายามลดจำนวนตัวแปรสภาพแวดล้อมที่คุณต้องสร้างเพื่อกำหนดค่าแต่ละเครื่อง
ในแต่ละเครื่องให้สร้างเชลล์สคริปต์ที่กำหนดตัวแปรสภาพแวดล้อมที่จำเป็นซึ่งเฉพาะสำหรับเครื่องนั้น (และอาจเฉพาะเจาะจงสำหรับผู้ใช้นั้นหากเกี่ยวข้อง)
อย่าใส่เชลล์สคริปต์การกำหนดค่าเฉพาะเครื่องในการควบคุมแหล่งที่มา แทนสำหรับแต่ละโปรเจ็กต์ให้คอมมิตสำเนาของสคริปต์ในไดเร็กทอรีรูทของโปรเจ็กต์เป็นเทมเพลตแทน
ต้องใช้สคริปต์บิลด์โปรเจ็กต์แต่ละตัวเพื่อตรวจสอบตัวแปรสภาพแวดล้อมแต่ละตัวและยกเลิกด้วยข้อความที่มีความหมายหากไม่ได้กำหนดไว้
ต้องใช้สคริปต์บิลด์โปรเจ็กต์แต่ละรายการเพื่อตรวจสอบไฟล์ปฏิบัติการบิวด์ของเครื่องมือสร้างที่ขึ้นต่อกันไฟล์ไลบรารีภายนอกและไฟล์ที่ส่งมอบได้ของโปรเจ็กต์ที่เกี่ยวข้องและยกเลิกด้วยข้อความที่มีความหมายหากไม่มีไฟล์เหล่านั้น
ต่อต้านสิ่งล่อใจในการส่งไฟล์ใด ๆ ที่สร้างขึ้นในการควบคุมแหล่งที่มา - ไม่มีการส่งมอบโครงการไม่มีแหล่งที่มาที่สร้างขึ้นไม่มีเอกสารที่สร้างขึ้นเป็นต้น
หากคุณใช้ IDE ให้สร้างไฟล์ควบคุมโปรเจ็กต์ใดก็ได้ที่คุณสามารถทำได้และอย่าผูกมัดไฟล์เหล่านั้นกับการควบคุมซอร์ส (ซึ่งรวมถึงไฟล์โปรเจ็กต์ Visual Studio)
สร้างเซิร์ฟเวอร์ที่มีสำเนาอย่างเป็นทางการของไลบรารีและเครื่องมือภายนอกทั้งหมดเพื่อคัดลอก / ติดตั้งบนเวิร์กสเตชันของนักพัฒนาและสร้างเครื่อง สำรองข้อมูลพร้อมกับที่เก็บการควบคุมแหล่งที่มาของคุณ
สร้างเซิร์ฟเวอร์รวมแบบต่อเนื่อง (สร้างเครื่อง) โดยไม่มีเครื่องมือในการพัฒนาใด ๆ
พิจารณาเครื่องมือสำหรับจัดการไลบรารีภายนอกและสิ่งที่ส่งมอบเช่น Ivy (ใช้กับ Ant)
อย่าใช้ Maven - มันจะทำให้คุณมีความสุขในตอนแรกและในที่สุดก็ทำให้คุณร้องไห้
โปรดทราบว่าสิ่งนี้ไม่เฉพาะเจาะจงสำหรับการโค่นล้มและส่วนใหญ่เป็นเรื่องทั่วไปสำหรับโครงการที่กำหนดเป้าหมายไปยังระบบปฏิบัติการฮาร์ดแวร์แพลตฟอร์มภาษา ฯลฯ ฉันใช้ไวยากรณ์เฉพาะของระบบปฏิบัติการและเครื่องมือเพียงเล็กน้อย แต่ใช้เพื่อภาพประกอบเท่านั้น - ฉันเชื่อว่าคุณจะแปลเป็นระบบปฏิบัติการหรือเครื่องมือที่คุณเลือก
หมายเหตุเพิ่มเติมเกี่ยวกับโซลูชัน Visual Studio: อย่าวางไว้ในการควบคุมแหล่งที่มา! ด้วยวิธีนี้คุณไม่จำเป็นต้องใช้เลยหรือคุณสามารถสร้างได้ (เช่นเดียวกับไฟล์โครงการ Visual Studio) อย่างไรก็ตามฉันคิดว่าเป็นการดีที่สุดที่จะฝากไฟล์โซลูชันไว้ให้นักพัฒนาแต่ละรายเพื่อสร้าง / ใช้ตามที่เห็นสมควร (แต่ไม่ได้เช็คอินเพื่อควบคุมแหล่งที่มา) ฉันเก็บRob.sln
ไฟล์ไว้บนเวิร์กสเตชันที่ใช้อ้างอิงโปรเจ็กต์ปัจจุบันของฉัน เนื่องจากโครงการของฉันเป็นแบบสแตนด์อะโลนทั้งหมดฉันจึงสามารถเพิ่ม / ลบโครงการได้ตามต้องการ (ซึ่งหมายความว่าไม่มีการอ้างอิงการอ้างอิงตามโครงการ)
โปรดอย่าใช้ Subversion externals (หรือคล้ายกันในเครื่องมืออื่น ๆ ) เนื่องจากเป็นการต่อต้านรูปแบบดังนั้นจึงไม่จำเป็น
เมื่อคุณใช้การผสานรวมแบบต่อเนื่องหรือแม้กระทั่งเมื่อคุณต้องการทำให้กระบวนการรีลีสเป็นอัตโนมัติให้สร้างสคริปต์ขึ้นมา สร้างเชลล์สคริปต์เดียวที่: รับพารามิเตอร์ของชื่อโปรเจ็กต์ (ตามรายการในที่เก็บ) และชื่อแท็กสร้างไดเร็กทอรีชั่วคราวภายในไดเร็กทอรีรูทที่กำหนดค่าได้ตรวจสอบซอร์สสำหรับชื่อโปรเจ็กต์และชื่อแท็กที่กำหนด (โดยการสร้าง URL ที่เหมาะสมในกรณีของการโค่นล้ม) ไปยังไดเร็กทอรีชั่วคราวนั้นดำเนินการสร้างใหม่ทั้งหมดที่รันการทดสอบและแพ็กเกจที่ส่งมอบได้ เชลล์สคริปต์นี้ควรทำงานกับโปรเจ็กต์ใด ๆ และควรตรวจสอบในคอนโทรลซอร์สซึ่งเป็นส่วนหนึ่งของโปรเจ็กต์ "build tools" ของคุณ เซิร์ฟเวอร์การรวมแบบต่อเนื่องของคุณสามารถใช้สคริปต์นี้เป็นรากฐานในการสร้างโปรเจ็กต์หรืออาจจัดเตรียมไว้ให้ก็ได้ (แต่คุณอาจต้องการของคุณเอง)
@VonC: คุณไม่ต้องการทำงานกับ "ant.jar" ตลอดเวลาแทนที่จะเป็น "ant-abcdjar" หลังจากที่คุณถูกเบิร์นเมื่อสคริปต์การสร้างของคุณหยุดทำงานเนื่องจากคุณเรียกใช้ Ant รุ่นที่เข้ากันไม่ได้โดยไม่รู้ตัว โดยเฉพาะอย่างยิ่งระหว่าง Ant 1.6.5 และ 1.7.0 โดยทั่วไปคุณมักต้องการทราบว่ามีการใช้ส่วนประกอบ EVERY เวอร์ชันใดบ้างรวมถึงแพลตฟอร์มของคุณ (Java ABCD) และเครื่องมือสร้างของคุณ (Ant EFGH) มิฉะนั้นคุณจะพบข้อบกพร่องในที่สุดและปัญหาใหญ่ครั้งแรกของคุณจะเป็นการติดตามว่าส่วนประกอบต่างๆของคุณเกี่ยวข้องกับเวอร์ชันใด เป็นการดีกว่าที่จะแก้ปัญหานั้นต่อหน้า