อะไรคือความแตกต่างระหว่างโฟลเดอร์“ lib” และ“ ผู้ขาย”?


103

เกี่ยวกับลำดับชั้นของโฟลเดอร์แหล่งที่มีเสมอบางคุณสมบัติทั่วไปเช่นsrc, docหรือtestโฟลเดอร์ที่มีค่อนข้างง่ายต่อการเข้าใจเนื้อหา

อย่างไรก็ตามฉันตระหนักว่าโครงการขนาดใหญ่มีทั้งlibและvendorโฟลเดอร์ในขณะที่ฉันคิดเสมอว่าพวกเขาเหมือนกันตามชื่อของพวกเขาบอกใบ้รวมถึง "บุคคลที่สามlibrariesจากภายนอกvendors" แม้ว่าจะเห็นทั้งในโครงการเดียวกันหมายความว่ามีคือความแตกต่าง

ฉันไม่พบข้อมูลใด ๆ ไม่ว่าจะใน Google หรือจากแหล่งข้อมูลอื่น ๆ เช่นมาตรฐานระบบแฟ้มลำดับชั้นถึงแม้ว่านี่จะเป็นเรื่องธรรมดาทั่วไปก็ตาม


นี่คือตัวอย่างที่มีรายละเอียดเพิ่มเติมกับSymfony : เมื่อคุณสร้างโครงการคุณจะได้รับlibโฟลเดอร์ที่รูทของโครงการของคุณ ในโฟลเดอร์นี้พบโครงสร้างต่อไปนี้:

lib
+--filter
+--form
+--…
+--vendor
    +--simpletest
    +--symfony

ที่นี่symfonyโฟลเดอร์ประกอบด้วยแกนทั้งหมดของ Symfony


3
@YannisRizos ฉันรู้ว่ามันไม่ได้อยู่ในแหล่งที่มาของพวกเขา เมื่อคุณเริ่มต้นทำงานในโครงการและสร้างโมดูลแม้ว่าคุณจะจบลงด้วยlib/vendorและไดเรกทอรีอื่น ๆ vendorตาม และพวกเขากำลังไม่ได้คนเดียว “ ทุกคนสามารถเลือกโครงสร้าง dir ใด ๆ ”ใช่แล้วขอบคุณ ทุกคนสามารถเขียนโค้ดได้ตามต้องการ ถ้าฉันต้องการโทรหาsrc“ woudzigouga” ฉันสามารถทำได้ ฉันไม่ได้ถามว่าฉันสามารถทำได้หรือไม่ แต่ทำไมคนอื่น ๆ ที่จริงจังและเป็นที่รู้จักทำสิ่งที่ดูเหมือนเป็นการปฏิบัติที่ดี
MattiSG

2
นอกเหนือจากที่เห็นได้ชัดที่libมีไลบรารีหลัก (ไลบรารีที่จำเป็นจริง ๆ หรือไลบรารีที่สร้างขึ้นจากผู้เขียนคนเดียวกันกับเฟรมเวิร์ก) และvendorเก็บไลบรารีบุคคลที่สามฉันไม่คิดว่าจะมีความแตกต่างที่มีเหตุผลอื่น ๆ ความแตกต่างนั้นค่อนข้างมีความสำคัญด้วยเหตุผลหลายประการและมันก็สมเหตุสมผลสำหรับการปฏิบัติทั่วไป
yannis

1
btw คุณสามารถเพิ่มคำอธิบายในความคิดเห็นของคำถามได้หรือไม่
yannis

@YannisRizos ชี้แจงอะไร? การค้นหา Google Code ที่พิสูจน์แล้วว่าคำถามของฉันไม่ได้เป็นการหลอกลวงทั้งหมดใช่ไหม จริง ๆ แล้วมันจะมีประโยชน์ถ้าคุณสามารถอธิบายรายละเอียดของ "เหตุผลต่าง ๆ " ซึ่งเป็นความแตกต่างที่สำคัญเช่นเดียวกับอธิบายว่าบางบุคคลที่สามรวมมีความสำคัญมากกว่าคนอื่น ๆ - ถ้าพวกเขารวมอยู่มีเหตุผลยกเว้น ผู้ดูแลไม่สามารถใช้รหัสได้
MattiSG

1
คุณสามารถสัมผัสสิ่งต่าง ๆ ใน / lib /, คุณไม่สามารถสัมผัสสิ่งต่าง ๆ ใน / ผู้ขาย /
Timo Huovinen

คำตอบ:


64

เมื่อฉันเห็นlibหรือlibrariesไดเรกทอรีฉันคิดว่า:

  • ไลบรารี่ไม่ใช่ปลั๊กอินโมดูล ฯลฯ
  • OOP แทนขั้นตอนที่ใช้ได้ (เช่น PHP)

เมื่อฉันเห็นvendorไดเรกทอรีฉันคิดว่า:

  • ไลบรารี่ปลั๊กอินโมดูลส่วนประกอบ ฯลฯ ไม่เพียง แต่ไลบรารี่เท่านั้น
  • และสิ่งที่ไม่ใช่รหัสเช่นชุดไอคอน

เมื่อฉันเห็นlibและทำvendorไดเรกทอรีฉันคิดถึงความแตกต่าง:

  1. libถือห้องสมุดเท่านั้นvendorอาจจะมีอะไรจริงๆ
  2. libเป็นที่ที่ฉันควรใส่ห้องสมุดของฉันvendorซึ่งฉันควรใส่บุคคลที่สามอะไร (รวมถึงรหัสโดยผู้เขียนต้นฉบับ)
  3. libเป็นที่ซึ่งห้องสมุดโดยผู้เขียนต้นฉบับของโครงการตั้งอยู่ (ไม่ใช่ของฉัน) ในขณะที่vendorเป็นที่ที่ผู้เขียนต้นฉบับใส่สิ่งที่บุคคลที่สาม
  4. คุณสามารถสันนิษฐานได้ว่าสิ่งที่อยู่ในlibนั้นได้รับอนุญาตภายใต้ใบอนุญาตเดียวกับส่วนที่เหลือของโครงการ

แล้วแต่อย่างใดอย่างหนึ่งข้างต้นมีเหตุผลพอที่จะมีโฟลเดอร์ที่แตกต่างกัน AFAIK ไม่มีวิธีปฏิบัติที่ยอมรับกันโดยทั่วไป ชุมชนบางแห่งมีแนวทางปฏิบัติร่วมกันทั่วทั้งชุมชน


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


2
“ สิ่งที่ไม่ใช่รหัส” จะอยู่ในdataหรือresources(หรือบางสิ่งที่แม่นยำยิ่งขึ้นตามแนวของimg), IMHO ยิ่งไปกว่านั้นในตัวอย่าง Symfony ของเราvendorมีแกน Symfony ทั้งหมดดังนั้นถ้าฉันไม่ได้รับ“ ผู้แต่งดั้งเดิม” ของคุณฉันไม่คิดว่าเหมาะกับประเด็นที่ 2 และ 3 ของคุณ
MattiSG

1
@ MattiSG โอ้ขอโทษฉันไม่ได้บอกว่ามันควรจะพอดีกับทั้งสี่จุด แค่หนึ่ง. และ "สิ่งที่ไม่ใช่รหัส" ควรอยู่ในไดเรกทอรีresourcesหรือassetsแต่ขึ้นอยู่กับโครงการมันอาจสมเหตุสมผลในvendorไดเรกทอรี (ฉันชอบassetsจริงๆ)
yannis

4
เอกพจน์หรือพหูพจน์ที่ดีกว่าคืออะไร? libvs libsและvendorvs vendors?
Quang

4
@Quang โครงการที่ได้รับความนิยมมากที่สุดที่ฉันเคยเห็นใช้เป็นเอกเทศ แต่ฉันก็ไม่รู้ว่าอันไหนดีกว่ากัน
yannis

@YannisRizos: คุณคิดอย่างไรกับ OOP แทนที่จะเป็นขั้นตอน
Matt O'Brien

21

คำตอบทั่วไปของ @ WayneM แต่ไม่กล้าแก้ไขมากนัก

ดังนั้นดูเหมือนว่าโครงสร้างนี้สามารถสังเกตได้ในกรอบแอ็พพลิเคชัน (อย่างน้อย Rails และ Symfony)

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

มันเป็น“ ระยะทางที่ไกลกว่า” libสำคัญเนื่องจากไม่มีกรอบการทำงานแอปพลิเคชันไม่มีประโยชน์ แต่ไม่ควรสัมผัสโดยผู้พัฒนาแอปพลิเคชัน: มันเป็นไลบรารีของผู้ขายเฟรมเวิร์


10

ในกรณีของสิ่งที่คล้าย Symfony libคือรหัสแอปพลิเคชัน (เช่นเขียนโดยนักพัฒนา) และvendorเป็นรหัสของบุคคลที่สาม คิดเหมือน lib คือสิ่งที่srcโฟลเดอร์ปกติและผู้ขายเป็น lib ปกติฉันจะเห็นสไตล์นั้นใน PHP เพราะคุณแยกแม่แบบ html ออกจากคลาสจริง


2

จากคำแนะนำเกี่ยวกับทรัพย์สินทางรถไฟของ Rails :

  • app/assets ใช้สำหรับเนื้อหาที่เป็นของแอปพลิเคชันเช่นรูปภาพที่กำหนดเองไฟล์ JavaScript หรือสไตล์ชีต

  • lib/assets สำหรับโค้ดไลบรารีของคุณเองซึ่งไม่เหมาะกับขอบเขตของแอปพลิเคชันหรือไลบรารีเหล่านั้นที่แชร์ข้ามแอปพลิเคชัน

  • vendor/assets สำหรับเนื้อหาที่เป็นของเอนทิตีภายนอกเช่นรหัสสำหรับปลั๊กอิน JavaScript และเฟรมเวิร์ก CSS

ฉันรู้ว่านี่ไม่ใช่คำถามเฉพาะของ Rails แต่คำอธิบายนั้นดีและชัดเจนและอาจขยายไปยังกรอบ / โครงสร้างโครงการอื่น ๆ

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