“ lib”文件夹和“ vendor”文件夹之间有什么区别?


103

对于源文件夹层次中,总有一些共同的特点,比如srcdoctest文件夹,其中有相当容易理解的内容。

但是,我意识到大型项目同时具有libvendor文件夹,而我一直认为它们是相同的,因为它们的名称暗示包括“ libraries来自外部的第三方vendors”。虽然,无论是在同一个项目中看到意味着一个区别。

我找不到任何信息,也找不到关于Google的信息,也找不到诸如Filesystem Hierarchy Standard之类的资源,尽管这实际上是一种普遍的做法。


这是Symfony的一个更详细的示例:创建项目后,您将lib在项目的根目录获得一个文件夹。在此文件夹中,找到以下结构:

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

在此,symfony文件夹包含了所有Symfony的核心。


3
@YannisRizos我知道它不在他们的来源中。但是,一旦开始处理项目并生成模块,您将获得lib/vendor和其他目录vendor。而且它们不是唯一的“每个人都可以选择任何目录结构”是的,谢谢。每个人都可以根据自己的意愿进行编码。如果我想称呼src“ woudzigouga”,我可以。我不是在问我是否可以,而是为什么其他认真而著名的人会做一些看起来很好的做法。
MattiSG 2011年

2
除了显而易见的,它lib拥有核心库(绝对必要的库,或者由与框架相同的作者构建的库)并vendor拥有第三方库,我认为没有其他明智的区别。出于各种原因,这种区别在某种程度上很重要,并且作为一般惯例是有意义的。
yannis 2011年

1
顺便说一句,您能否在问题本身的评论中添加说明?
yannis 2011年

@YannisRizos有什么澄清?Google Code搜索证明我的问题不是完全伪造的吗?如果您可以详细说明区分这一点很重要的“各种原因”,并解释其中包括的第三方如何比其他一些更为重要,那么这实际上会有所帮助。维护者是不称职且包含批处理的代码。
MattiSG 2011年

1
您可以触摸/ lib /中的内容,而不能触摸/ vendor /中的内容
Timo Huovinen

Answers:


64

当我看到一个liblibraries目录时,我想到:

  • 库,而不是插件,模块等。
  • 在适用的情况下,用OOP代替程序式(即PHP)

当我看到vendor目录时,会想到:

  • 库,插件,模块,组件等。不仅是库,而且还有第三方提供的任何内容。
  • 还有不是代码的东西,例如图标集。

当我看到libvendor目录时,我想到了一些区别:

  1. lib只拥有图书馆,vendor可能真正拥有任何东西,
  2. lib是我应该放置库的vendor地方,我应该放置任何第三方的地方(包括原始作者的代码),
  3. lib是项目原作者的库所在的位置(如果不是我的话),而vendor原作者将任何东西放在第三方的位置。
  4. 您可以放心地假定其中的任何内容都lib与该项目的其余部分获得了相同的许可。

无论采用上述哪种方法,都有足够的理由拥有不同的文件夹。AFAIK没有公认的惯例。一些社区具有社区范围内的通用做法,仅此而已。


至于特定的Symfony示例:Symfony是一个框架,我认为开发人员要说的是,在Symfony应用程序中,框架的核心库是供应商代码,即来自第三方,而不是来自应用程序的原始作者。 (您)。


2
恕我直言,“不是代码的东西”将位于dataresources(或类似的词img)。此外,在我们的Symfony的例子,vendor实际上包含了所有的Symfony的核心,所以,除非我不明白你的“原作者”面额的,我不认为适合您的点2和3
MattiSG

1
@MattiSG啊,对不起,我不是说它应该适合所有四个点。只有一个。“不是代码的东西”应该放在resourcesassets目录中,但是根据项目的不同,它可能在vendor目录中有意义(我更喜欢assets)。
yannis 2011年

4
最好是单数还是复数?libvs libsvendorvs vendors
Quang 2012年

4
@Quang我见过的最受欢迎的项目都使用单数,但我不知道哪个更好。
扬尼斯,2012年

@YannisRizos:是什么让您想到OOP而不是程序?
Matt O'Brien 2014年

21

概括@WayneM的答案,但不敢对其进行太多编辑。

因此,似乎可以在应用程序框架中观察到这种结构(至少是Rails和Symfony)。

对于应用程序开发人员来说,这是保持lib/ src结构完好无损的一种方法,同时又增加了使用框架所带来的其他距离:该vendor文件夹实际上包含框架的库,而该lib文件夹保留了应用程序包含的库src及其源代码。文件。

这是“更遥远的” lib,至关重要的,因为如果没有框架,应用程序将无用,但不会被应用程序的开发人员所感动:它是框架供应商的库


10

对于类似Symfony的情况,lib是应用程序代码(即由开发人员编写),并且vendor是第三方代码。可以将其想像成lib src通常是文件夹,供应商就是lib。我通常在PHP中看到该样式,因为您将html模板与实际类分开了。


2

Rails Asset Pipeline指南中

  • app/assets 适用于应用程序拥有的资产,例如自定义图像,JavaScript文件或样式表。

  • lib/assets 用于您自己的库代码,这些代码实际上不适合应用程序或跨应用程序共享的库的范围。

  • vendor/assets 适用于外部实体拥有的资产,例如JavaScript插件和CSS框架的代码。

我知道这不是特定于Rails的问题,但是解释是清楚而明确的,并且可能扩展到其他框架/项目结构。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.