วิธีการจัดการการอ้างอิงสำหรับโครงการ C / C ++ อย่างถูกต้อง?


11

ฉันมีโครงการที่ใช้ไลบรารี C / C ++ โอเพ่นซอร์ส 3-4 แบบ

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

อย่างไรก็ตามฉันต่อสู้กับปัญหาสองสามอย่าง โครงการทั้งหมดเหล่านี้เป็นการบริหารการพึ่งพา และฉันกำลังมองหาคำแนะนำวิธีปฏิบัติที่ดีที่สุด

1) ฉันจะรู้ได้อย่างไรว่าฉันใช้อะไรกันแน่

ฉันไม่มีทางที่จะไปรับ lib แบบคงที่ เป็นผลให้ฉันต้องติดตามอย่างใดอย่างหนึ่ง lib แบบคงที่ฉันใช้ (อาจ SHA ของการกระทำที่มันถูกสร้างขึ้น)?

นี่เป็นสิ่งสำคัญอย่างยิ่งเมื่อฉันต้องคิดเมื่อต้องอัพเกรด libs เหล่านี้

2) ฉันจะสร้างงานสร้างใหม่ได้อย่างไร

ฉันอาจพยายามสร้างห้องสมุดเฉพาะสำหรับแพลตฟอร์มเฉพาะ ฉันใช้เวลาซักพักนึง

ครั้งต่อไปที่ฉันจะต้องสร้างห้องสมุดเดียวกันอาจจะเป็นในครึ่งปี (เมื่อฉันจะต้องอัพเกรดด้วยเหตุผลใดก็ตามอย่างไรก็ตามในเวลานั้นฉันจะไม่จำอะไรและสภาพแวดล้อมที่มันถูกสร้างขึ้น จะหายไปนาน

3) ฉันควรแยกไลบรารี่เหล่านี้ให้มีซอร์สโค้ดหรือไม่

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

คำตอบ:


5

คุณจำเป็นต้องใช้ไลบรารี่รุ่นที่แน่นอนหรือไม่ มันเขียนไม่ดี / มันเป็น API ที่เพิ่มขึ้นทุกรุ่นหรือไม่?

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

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


2
ฉันไม่คิดว่าฉันต้องใช้เวอร์ชันที่แน่นอน อย่างไรก็ตามฉันต้องรู้ว่าฉันใช้อันไหน ตัวอย่างเช่นถ้าใครบางคนพบว่า OpenSSL 1.1.0b มีช่องโหว่ขนาดใหญ่ฉันควรรู้ว่าฉันใช้ OpenSSL 1.1.0b หรือ 1.1.0c หรือไม่
Victor Ronin

เกี่ยวกับการสร้างการทำซ้ำนั่นอาจเป็นความกังวลอันดับสองของฉัน
Victor Ronin

3

ฉันจะรู้ได้อย่างไรว่าฉันใช้อะไรกันแน่

หากไฟล์รวมหรือไฟล์ libs ไม่มีหมายเลขเวอร์ชันอยู่แล้วให้เพิ่มไฟล์ข้อความ "version.txt" (มีหมายเลขเวอร์ชั่น) ด้วยตัวคุณเองไปยังแต่ละโฟลเดอร์ lib และตรวจสอบใน VCS ของคุณพร้อมกับ lib และรวมไฟล์ . อย่างไรก็ตามหากคุณเวอร์ชั่นแหล่งที่มาแบบเต็มของ lib (จุดที่ 3) โอกาสสูงมีไฟล์ซอร์สโค้ดที่มีหมายเลขเวอร์ชั่นอยู่แล้วดังนั้นไม่จำเป็นต้องดูแลรักษาตัวเองสำหรับกรณีนี้

ฉันจะสร้างการสร้างใหม่ได้อย่างไร

พยายามทำให้อัตโนมัติให้มากที่สุด ใช้สคริปต์ไฟล์หรือไฟล์ของเครื่องมือสร้างที่คุณชื่นชอบ วางทั้งหมดนี้ไว้ภายใต้การควบคุมของแหล่งที่มา หากมีขั้นตอนที่ต้องทำด้วยตนเองให้เขียนรายละเอียดลงในไฟล์ข้อความ (เช่น readme_build.txt) และวางไว้ภายใต้การควบคุมของแหล่งข้อมูลเช่นกัน

ฉันควรแยกไลบรารีเหล่านี้เพื่อให้มีซอร์สโค้ดหรือไม่

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

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


ดังนั้นคำตอบคือ "ทำสิ่งนี้ด้วยตนเอง" :) ฉันหวังว่าบางคนจะพูดว่า ... โอ้ ... มีเครื่องมือสำหรับการนั้น :) เมื่อคุณพูดว่า "คัดลอกซอร์สโค้ด" คุณหมายถึงแค่ได้รับ ไฟล์ tar ที่มีซอร์สและดัมพ์ในการควบคุมซอร์ส?
Victor Ronin

1
@VictorRonin: ไม่คำตอบคือ "ให้ VCS ของคุณจัดการทุกอย่างที่ทำได้สำหรับคุณ" และ "ทำให้เป็นอัตโนมัติมากที่สุดเท่าที่คุณสามารถใช้เครื่องมือสร้างมาตรฐาน" คุณเป็นคนที่เลือกรุ่นที่เฉพาะเจาะจงและคุณเป็นคนที่ต้องการกำหนดขั้นตอนการสร้างลิงค์และรวมการอ้างอิงสำหรับสภาพแวดล้อมของคุณ ขั้นตอนมาตรฐานสำหรับการสำแดงการดูหมิ่นเหล่านี้คือผ่านสคริปต์, makefile, ไฟล์โครงการและอื่น ๆ
Doc Brown

... และวิธีที่คุณได้รับ lib หรือซอร์สโค้ดไลบรารีขึ้นอยู่กับวิธีที่ผู้ดูแล / ผู้ขายจัดทำ อาจจะเป็นลูก tar, โดยการเข้าถึงโดยตรงไปยังศูนย์กลาง git, อาจเป็นแพคเกจนักเก็ต
Doc Brown
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.