¿Cuál es la diferencia entre las carpetas "lib" y "vendor"?

103

Con respecto a la jerarquía de carpetas de origen, siempre hay algunas características comunes, tales como el src, doco testcarpetas, que tienen bastante fácil de entender el contenido.

Sin embargo, me di cuenta de que los grandes proyectos tienen tanto una liby vendorcarpetas, mientras que yo siempre había pensado que eran los mismos, como sus nombres hacen alusión a que incluye “terceros librariesdesde el exterior vendors”. Sin embargo, al ver tanto en el mismo proyecto significa que no es una diferencia.

No pude encontrar ninguna información ni en Google ni en fuentes como el Estándar de Jerarquía del Sistema de Archivos , a pesar de que esta es una práctica común de alguna manera .


Aquí hay un ejemplo más detallado con Symfony : una vez que crea un proyecto, obtiene una libcarpeta en la raíz de su proyecto. En esta carpeta, se encuentra la siguiente estructura:

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

Aquí, la symfonycarpeta contiene todo el núcleo de Symfony.

MattiSG
fuente
3
@ YannisRizos Sé que no está en su fuente. Sin embargo, una vez que comience a trabajar en un proyecto y genere módulos, terminará con lib/vendorotros directorios vendor. Y no son los únicos . "Todos pueden seleccionar cualquier estructura de directorio" Sí, bueno, gracias. Todos pueden codificar como quieran. Si quiero llamar src"woudzigouga", puedo hacerlo. No estoy preguntando si puedo, sino por qué otros que son serios y conocidos hacen algo que parece una buena práctica.
MattiSG
2
Aparte de lo obvio, que libcontiene bibliotecas centrales (bibliotecas absolutamente esenciales O bibliotecas construidas del mismo autor que el marco) y vendorcontiene bibliotecas de terceros, no creo que haya otra distinción sensata. Esa distinción es algo importante por una variedad de razones, y tiene sentido como práctica genérica.
yannis 05 de
1
por cierto, ¿podría agregar las aclaraciones en los comentarios a la pregunta en sí?
Yannis
@YannisRizos ¿Qué aclaraciones? ¿La búsqueda de Google Code que prueba mi pregunta no es totalmente falsa? En realidad, sería útil si pudiera detallar la "variedad de razones" por las cuales la distinción es importante, así como explicar cómo algunos terceros incluidos pueden ser más esenciales que otros; si están incluidos, hay una razón, a menos que Los mantenedores son incompetentes e incluyen código de lote.
MattiSG
1
Puedes tocar cosas en / lib /, no puedes tocar cosas en / vendor /
Timo Huovinen

Respuestas:

64

Cuando veo un directorio libo libraries, pienso en:

  • Bibliotecas, no complementos, módulos, etc.
  • OOP en lugar de procedimiento, donde sea aplicable (es decir, PHP)

Cuando veo un vendordirectorio, pienso en:

  • Bibliotecas, complementos, módulos, componentes, etc. No solo bibliotecas, sino cualquier cosa que sea proporcionada por un tercero.
  • Y cosas que no son código, como un conjunto de iconos.

Cuando veo liby vendordirectorios, pienso en algunas distinciones:

  1. libsolo contiene bibliotecas, vendorpuede contener cualquier cosa realmente,
  2. libes donde debería poner mis bibliotecas, vendordonde debería poner cualquier cosa de terceros (incluido el código del autor original),
  3. libes donde se encuentran las bibliotecas del autor original del proyecto (si ese no soy yo), mientras que vendores donde el autor original pone algo de terceros.
  4. Puede suponer con seguridad que todo lo que está dentro libtiene licencia bajo la misma licencia que el resto del proyecto.

Cualquiera de los anteriores aplica, es razón suficiente para tener diferentes carpetas. AFAIK no existe una práctica generalmente aceptada. Algunas comunidades tienen prácticas comunes en toda la comunidad, pero eso es todo.


En cuanto al ejemplo específico de Symfony: Symfony es un marco y creo que lo que los desarrolladores intentan decir es que en una aplicación Symfony las bibliotecas centrales del marco son código de proveedor, es decir, provienen de un tercero y no del autor original de la aplicación. (tú).

Yannis
fuente
2
"Cosas que no son código" estaría en datao resources(o algo más preciso en la línea de img), en mi humilde opinión. Además, en nuestro ejemplo de Symfony, en vendorrealidad contiene todo el núcleo de Symfony, así que a menos que no obtenga su denominación de "autor original", no creo que se ajuste a sus puntos 2 y 3.
MattiSG
1
@ MattiSG Ah, lo siento, no estoy diciendo que debería encajar en los cuatro puntos. Solo uno. Y "Cosas que no son código" deberían estar en un directorio resourceso assets, pero dependiendo del proyecto podría tener sentido en un vendordirectorio (prefiero assetsrealmente).
yannis
44
¿Qué es mejor singular o plural? libvs libsy vendorvs vendors?
Quang
44
@Quang Los proyectos más populares que he visto usan singular, pero no tengo idea de cuál es mejor.
Yannis
@ YannisRizos: ¿qué te hace pensar en OOP en lugar de procedimiento?
Matt O'Brien
21

Generalizando la respuesta de @ WayneM pero sin atreverse a editarla tanto.

Entonces, parece que esta estructura se puede observar en los marcos de aplicación (Rails y Symfony al menos).

Es una forma de mantener intacta la estructura lib/ srcpara los desarrolladores de aplicaciones, al tiempo que agrega el otro nivel de distancia que brinda el uso de un marco: la vendorcarpeta en realidad contiene las bibliotecas del marco, dejando la libcarpeta para las bibliotecas incluidas de la aplicación y srcpara su fuente archivos.

Es un "más distante" lib, vital ya que sin el marco, la aplicación es inútil, pero no debe ser tocada por el desarrollador de la aplicación: son las bibliotecas del proveedor del marco .

MattiSG
fuente
10

En el caso de algo como Symfony, libes el código de la aplicación (es decir, escrito por los desarrolladores) y vendores un código de terceros. Piense en ello como lib es lo que srcnormalmente es la carpeta, y el proveedor es lib. Normalmente veo ese estilo en PHP porque separas las plantillas html de las clases reales.

Wayne Molina
fuente
2

De la guía Rails Asset Pipeline :

  • app/assets es para los activos que son propiedad de la aplicación, como imágenes personalizadas, archivos JavaScript u hojas de estilo.

  • lib/assets es para el código de sus propias bibliotecas que realmente no se ajusta al alcance de la aplicación o las bibliotecas que se comparten entre las aplicaciones.

  • vendor/assets es para activos que son propiedad de entidades externas, como el código para complementos de JavaScript y marcos CSS.

Sé que esta no es una pregunta específica de Rails, pero la explicación es buena y clara y probablemente se extiende a otros marcos / estructuras de proyectos.

Chico Carvalho
fuente