Was ist der Unterschied zwischen den Ordnern "lib" und "vendor"?

103

Im Hinblick auf Quellenordnerhierarchie, gibt es immer einige gemeinsame Merkmale, wie zum Beispiel die src, docoder testOrdner, die ziemlich einfach zu verstehen haben Inhalte.

Mir wurde jedoch klar, dass große Projekte sowohl einen libals auch einen vendorOrdner haben, obwohl ich immer gedacht hatte, dass sie gleich sind, da ihre Namen darauf hindeuten, dass „Dritte librariesvon außen vendors“ eingeschlossen sind. Beide im selben Projekt zu sehen, bedeutet jedoch einen Unterschied.

Ich konnte weder auf Google noch auf Quellen wie Filesystem Hierarchy Standard Informationen finden , obwohl dies eigentlich eine übliche Praxis ist.


Im Folgenden finden Sie ein ausführlicheres Beispiel für Symfony : Sobald Sie ein Projekt erstellt haben, erhalten Sie einen libOrdner im Stammverzeichnis Ihres Projekts. In diesem Ordner befindet sich folgende Struktur:

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

Hier symfonyenthält der Ordner den gesamten Kern von Symfony.

MattiSG
quelle
3
@ YannisRizos Ich weiß, es ist nicht in ihrer Quelle. Sobald Sie jedoch mit der Arbeit an einem Projekt beginnen und Module generieren, werden Sie auch lib/vendorandere Verzeichnisse finden vendor. Und sie sind nicht die einzigen . "Jeder kann eine beliebige Verzeichnisstruktur auswählen" Ja, danke. Jeder kann programmieren, wie er will. Wenn ich src"Woudzigouga" nennen möchte, kann ich. Ich frage nicht, ob ich kann, sondern warum andere, die ernst und bekannt sind, etwas tun, das wie eine gute Praxis aussieht.
MattiSG
2
Abgesehen von dem offensichtlichen, das libKernbibliotheken enthält (absolut notwendige Bibliotheken ODER Bibliotheken, die vom selben Autor wie das Framework erstellt wurden) und vendorBibliotheken von Drittanbietern, glaube ich, gibt es keinen anderen vernünftigen Unterschied. Diese Unterscheidung ist aus verschiedenen Gründen etwas wichtig und als generische Praxis sinnvoll.
Yannis
1
Übrigens, könnten Sie die Erläuterungen in den Kommentaren zur Frage selbst hinzufügen?
Yannis
@YannisRizos Welche Klarstellungen? Die Google Code-Suche, die beweist, dass meine Frage nicht völlig falsch ist? Es wäre hilfreich, wenn Sie die „Vielzahl von Gründen“, für die die Unterscheidung wichtig ist, detaillieren und erläutern könnten, wie einige eingeschlossene Dritte wichtiger sein können als andere - wenn sie eingeschlossen sind, gibt es einen Grund, sofern nicht der Betreuer sind inkompetent und enthalten Batch-Code.
MattiSG
1
Sie können Dinge in / lib / berühren, Sie können Dinge in / vendor / nicht berühren
Timo Huovinen

Antworten:

64

Wenn ich ein liboder ein librariesVerzeichnis sehe, denke ich an:

  • Bibliotheken, keine Plugins, Module usw.
  • OOP statt prozedural, wo dies zutrifft (zB PHP)

Wenn ich ein vendorVerzeichnis sehe, denke ich an:

  • Bibliotheken, Plugins, Module, Komponenten usw. Nicht nur Bibliotheken, sondern alles, was von Dritten bereitgestellt wird.
  • Und solche Sachen, die kein Code sind, wie ein Icon-Set.

Wenn ich sehe , libund vendorVerzeichnisse, denke ich an ein paar Unterschiede:

  1. libhält nur Bibliotheken, vendorkann alles wirklich halten,
  2. libist der Ort, an dem ich meine Bibliotheken ablegen soll, an vendordem ich irgendetwas von Dritten ablegen soll (einschließlich Code des ursprünglichen Autors),
  3. libHier befinden sich Bibliotheken des ursprünglichen Autors des Projekts (wenn das nicht ich bin), wohingegen vendorder ursprüngliche Autor alles an Dritte weitergibt.
  4. Sie können davon ausgehen, dass alles, was sich in libdiesem Projekt befindet, unter derselben Lizenz wie der Rest des Projekts lizenziert ist.

Unabhängig davon, welcher der oben genannten Punkte zutrifft, ist Grund genug, unterschiedliche Ordner zu haben. AFAIK gibt es keine allgemein anerkannte Praxis. Einige Gemeinden haben gemeinnützige Praktiken, aber das ist genau das Richtige.


Was das spezifische Symfony-Beispiel betrifft: Symfony ist ein Framework, und ich denke, die Entwickler versuchen zu sagen, dass in einer Symfony-Anwendung die Kernbibliotheken des Frameworks Herstellercode sind, dh von einem Drittanbieter stammen und nicht vom ursprünglichen Autor der Anwendung (Sie).

yannis
quelle
2
"Zeug, das kein Code ist" wäre in dataoder resources(oder etwas genaueres im Sinne von img), IMHO. Darüber hinaus vendorenthält unser Symfony-Beispiel tatsächlich den gesamten Symfony-Kern. Wenn ich also nicht die Bezeichnung Ihres „ursprünglichen Autors“ erhalte, glaube ich nicht, dass dies zu Ihren Punkten 2 und 3 passt.
MattiSG
1
@MattiSG Ah, tut mir leid, ich sage nicht, dass es für alle vier Punkte passen sollte. Nur einer. Und "Zeug, das kein Code ist" sollte sich in einem resourcesoder einem assetsVerzeichnis befinden, aber je nach Projekt kann es in einem vendorVerzeichnis sinnvoll sein (ich bevorzuge es assetswirklich).
Yannis
4
Was ist besser Singular oder Plural? libvs libsund vendorvs vendors?
Quang
4
@Quang Die beliebtesten Projekte, die ich gesehen habe, verwenden Singular, aber ich habe keine Ahnung, welches besser ist.
Yannis
@YannisRizos: Wie kommst du auf OOP anstatt auf prozedural?
Matt O'Brien
21

Verallgemeinern Sie die Antwort von @ WayneM, aber trauen Sie sich nicht, sie so sehr zu bearbeiten.

Es scheint also, dass diese Struktur in Anwendungsframeworks (zumindest Rails und Symfony) beobachtet werden kann.

Für Anwendungsentwickler ist dies eine Möglichkeit, die lib/ src-Struktur intakt zu halten , während gleichzeitig die andere Entfernungsebene hinzugefügt wird, die durch die Verwendung eines Frameworks entsteht: Der vendorOrdner enthält tatsächlich die Bibliotheken des Frameworks, und der libOrdner verbleibt für die enthaltenen Bibliotheken der Anwendung und srcfür die Quelle Dateien.

Es ist ein "entfernteres" lib, entscheidendes Element, da die Anwendung ohne das Framework nutzlos ist, aber vom Anwendungsentwickler nicht berührt werden darf: Es handelt sich um die Bibliotheken des Framework-Anbieters .

MattiSG
quelle
10

Bei Symfony libhandelt es sich um den Anwendungscode (dh von den Entwicklern geschrieben) und vendorum Code von Drittanbietern. Stellen Sie es sich so vor, als wäre lib das, was der srcOrdner normalerweise ist, und der Hersteller ist lib. Normalerweise sehe ich diesen Stil in PHP, weil Sie die HTML-Vorlagen von den tatsächlichen Klassen trennen.

Wayne Molina
quelle
2

Aus dem Rails Asset Pipeline-Handbuch :

  • app/assets Dies gilt für Assets, deren Eigentümer die Anwendung ist, z. B. benutzerdefinierte Bilder, JavaScript-Dateien oder Stylesheets.

  • lib/assets ist für den Code Ihrer eigenen Bibliotheken gedacht, der nicht wirklich in den Anwendungsbereich oder die Bibliotheken passt, die von mehreren Anwendungen gemeinsam genutzt werden.

  • vendor/assets Dies gilt für Assets, deren Eigentümer externe Entitäten sind, z. B. Code für JavaScript-Plugins und CSS-Frameworks.

Ich weiß, dass dies keine Rails-spezifische Frage ist, aber die Erklärung ist gut und klar und erstreckt sich wahrscheinlich auch auf andere Frameworks / Projektstrukturen.

Chico Carvalho
quelle