Apa perbedaan antara folder "lib" dan "vendor"?

103

Mengenai hierarki folder sumber, selalu ada beberapa fitur umum, seperti src, docatau testfolder, yang memiliki konten yang agak mudah dipahami.

Namun, saya menyadari bahwa proyek-proyek besar memiliki a libdan vendorfolder, sementara saya selalu berpikir mereka sama, seperti nama mereka mengisyaratkan termasuk "pihak ketiga librariesdari luar vendors". Padahal, melihat kedua dalam proyek yang sama berarti ada adalah perbedaan.

Saya tidak dapat menemukan informasi atau di Google atau pada sumber-sumber seperti Filesystem Hierarchy Standard , meskipun ini sebenarnya merupakan praktik yang umum .


Berikut ini adalah contoh yang lebih rinci dengan Symfony : setelah Anda membuat proyek, Anda mendapatkan libfolder di root proyek Anda. Dalam folder ini, struktur berikut ditemukan:

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

Di sini, symfonyfolder tersebut berisi semua inti Symfony.

MattiSG
sumber
3
@YannisRizos Saya tahu ini bukan dari sumbernya. Setelah Anda mulai mengerjakan proyek dan menghasilkan modul, Anda akan berakhir dengan lib/vendordan direktori lain vendor. Dan mereka bukan satu-satunya . "Semua orang dapat memilih struktur dir" Ya, terima kasih. Setiap orang dapat membuat kode sesuai keinginan mereka. Jika saya ingin memanggil src"woudzigouga", saya bisa. Saya tidak bertanya apakah saya bisa tetapi mengapa orang lain yang serius dan terkenal melakukan sesuatu yang terlihat seperti praktik yang baik.
MattiSG
2
Selain yang sudah jelas, yang libmemegang perpustakaan inti (perpustakaan yang sangat esensial ATAU perpustakaan yang dibangun dari penulis yang sama dengan kerangka kerja) dan vendormemegang perpustakaan pihak ketiga, saya tidak berpikir ada perbedaan waras lainnya. Perbedaan itu agak penting karena berbagai alasan, dan itu masuk akal sebagai praktik generik.
yannis
1
btw, bisakah Anda menambahkan klarifikasi di komentar ke pertanyaan itu sendiri?
yannis
@YannisRizos Klarifikasi apa? Pencarian Kode Google membuktikan pertanyaan saya tidak sepenuhnya palsu? Sebenarnya akan sangat membantu jika Anda dapat merinci "berbagai alasan" yang membedakannya penting, serta menjelaskan bagaimana beberapa pihak ketiga yang dimasukkan dapat lebih penting daripada yang lain - jika mereka disertakan, ada alasannya, kecuali jika pengelola tidak kompeten dan menyertakan kode secara batch.
MattiSG
1
Anda dapat menyentuh hal-hal di / lib /, Anda tidak dapat menyentuh hal-hal di / vendor /
Timo Huovinen

Jawaban:

64

Ketika saya melihat direktori libatau libraries, saya memikirkan:

  • Perpustakaan, bukan plugin, modul, dll.
  • OOP alih-alih prosedural, di mana itu berlaku (yaitu PHP)

Ketika saya melihat vendordirektori, saya memikirkan:

  • Perpustakaan, plugin, modul, komponen, dll. Tidak hanya perpustakaan, tetapi apa pun yang disediakan oleh pihak ketiga.
  • Dan hal-hal yang bukan kode, seperti set ikon.

Ketika saya melihat libdan vendordirektori, saya memikirkan beberapa perbedaan:

  1. libhanya memegang perpustakaan, vendordapat menyimpan apa saja,
  2. libDi sinilah saya harus meletakkan perpustakaan saya, di vendormana saya harus meletakkan apa pun pihak ketiga (termasuk kode oleh penulis asli),
  3. libadalah tempat perpustakaan oleh penulis asli proyek berada (jika itu bukan saya), sedangkan di vendormana penulis asli meletakkan apa pun pihak ketiga.
  4. Anda dapat dengan aman berasumsi bahwa apa pun yang ada di libdalamnya dilisensikan dengan lisensi yang sama dengan proyek lainnya.

Mana pun dari yang di atas berlaku, cukup alasan untuk memiliki folder yang berbeda. AFAIK tidak ada praktik yang diterima secara umum. Beberapa komunitas memiliki praktik umum yang luas di masyarakat, tetapi hanya itu saja.


Adapun contoh Symfony spesifik: Symfony adalah suatu kerangka kerja dan saya pikir apa yang pengembang katakan adalah bahwa dalam aplikasi Symfony pustaka inti kerangka kerja adalah kode vendor, yaitu berasal dari pihak ketiga dan bukan dari penulis asli aplikasi tersebut. (kamu).

yannis
sumber
2
"Hal-hal yang bukan kode" akan berada di dataatau resources(atau sesuatu yang lebih tepat di sepanjang baris img), IMHO. Terlebih lagi, dalam contoh Symfony kami, vendorsebenarnya berisi semua inti Symfony, jadi kecuali jika saya tidak mendapatkan denominasi "penulis asli" Anda, saya tidak berpikir itu sesuai dengan poin 2 dan 3. Anda
MattiSG
1
@MattiSG Ah, maaf, saya tidak mengatakan itu harus sesuai dengan keempat poin. Hanya satu. Dan "Hal-hal yang bukan kode" harus berada dalam direktori resourcesatau assets, tetapi tergantung pada proyek itu bisa masuk akal dalam vendordirektori (saya lebih suka assetsbenar-benar).
yannis
4
Apa yang lebih baik tunggal atau jamak? libvs libsdan vendorvs vendors?
Quang
4
@ Quang Proyek paling populer yang pernah saya lihat menggunakan singular, tapi saya tidak tahu mana yang lebih baik.
yannis
@YannisRizos: apa yang membuat Anda berpikir tentang OOP alih-alih prosedural?
Matt O'Brien
21

Generalisasi jawaban @ WayneM tetapi tidak berani mengeditnya terlalu banyak.

Jadi, tampaknya struktur ini dapat diamati dalam kerangka kerja aplikasi (setidaknya Rails dan Symfony).

Ini adalah cara untuk menjaga lib/ srcstruktur tetap untuk pengembang aplikasi, sambil menambahkan tingkat jarak lain yang dibawa oleh penggunaan kerangka kerja: vendorfolder tersebut sebenarnya berisi pustaka kerangka kerja, meninggalkan libfolder untuk pustaka aplikasi yang disertakan, dan srcuntuk sumbernya file.

Ini adalah "lebih jauh" lib, penting karena tanpa kerangka kerja, aplikasi tidak berguna, tetapi tidak untuk disentuh oleh pengembang aplikasi: itu adalah perpustakaan kerangka kerja vendor .

MattiSG
sumber
10

Dalam kasus sesuatu seperti Symfony, libadalah kode aplikasi (yaitu yang ditulis oleh pengembang) dan vendormerupakan kode pihak ketiga. Anggap saja lib adalah srcfolder yang biasanya, dan vendor lib. Saya biasanya melihat gaya itu di PHP karena Anda memisahkan template html dari kelas yang sebenarnya.

Wayne Molina
sumber
2

Dari panduan Pipeline Asset Rails :

  • app/assets adalah untuk aset yang dimiliki oleh aplikasi, seperti gambar khusus, file JavaScript, atau stylesheet.

  • lib/assets adalah untuk kode perpustakaan Anda sendiri yang tidak benar-benar cocok dengan ruang lingkup aplikasi atau perpustakaan yang dibagikan di seluruh aplikasi.

  • vendor/assets adalah untuk aset yang dimiliki oleh entitas luar, seperti kode untuk plugin JavaScript dan kerangka kerja CSS.

Saya tahu ini bukan pertanyaan Rails khusus, tetapi penjelasannya bagus dan jelas dan mungkin meluas ke kerangka kerja lain / struktur proyek.

Chico Carvalho
sumber