关于源文件夹层次结构,总是存在一些共同的功能,例如srcdoctest文件夹,它们具有相当容易理解的内容。

但是,我意识到大型项目都具有一个共同点。 libvendor文件夹虽然我一直认为它们是相同的,但它们的名称暗示包括“来自外部libraries的第三方vendors”。但是,在同一个项目中看到这两者意味着存在差异。

我找不到任何信息,也找不到有关Google的信息,也找不到诸如Filesystem Hierarchy Standard之类的资源,尽管实际上这在某种程度上很常见实践。这是Symfony的一个更详细的示例:创建项目后,您将在项目根目录下找到一个lib文件夹。在此文件夹中,找到以下结构:

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


这里,symfony文件夹包含Symfony的所有核心。

评论

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

除了显而易见的是,lib拥有核心库(绝对必要的库,或者由与框架相同的作者构建的库),而供应商拥有第三方库,我认为没有其他合理的区别。出于各种原因,这种区别在某种程度上是很重要的,并且作为通用做法是有意义的。

顺便说一句,您能在评论中添加对问题本身的澄清吗?

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

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

#1 楼

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


库,而不是插件,模块等。
在适用的情况下,OOP而不是程序(例如PHP)

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


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

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



lib仅包含库,vendor可能确实包含任何东西,

lib是我应该放置库的位置,vendor我应该放置任何第三方的位置(包括原始作者的代码),

lib是原始作者的位置该项目的所在地(如果不是我),而vendor是原始作者放置第三方任何东西的地方。
您可以放心地假设lib中的任何内容均与该项目的其余部分具有相同的许可。

满足以上任一条件的理由足以拥有不同的文件夹。 AFAIK没有公认的惯例。一些社区具有社区范围内的通用做法,仅此而已。


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

评论


恕我直言,“不是代码的东西”将存在于数据或资源中(或者在img方面更为精确的东西)。此外,在我们的Symfony示例中,供应商实际上包含了所有Symfony核心,因此,除非我没有得到您的“原始作者”面额,否则我认为这不适合您的第2点和第3点。

– MattiSG
2011-12-5 11:13



@MattiSG啊,对不起,我不是说它应该适合所有四个点。只有一个。 “不是代码的东西”应该放在资源或资产目录中,但是根据项目的不同,在供应商目录中还是有意义的(我确实更喜欢资产)。

– yannis
2011-12-5 11:15

最好是单数还是复数? lib vs libs和供应商vs供应商?

–匡
2012年10月17日19:24

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

– yannis
2012年10月17日19:25

@YannisRizos:是什么让您想到OOP而不是程序?

–tumultous_rooster
14-10-27在18:22

#2 楼

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

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

它是一种为应用程序开发人员保持lib / src结构完整的方法,同时增加了使用框架所带来的其他距离:vendor文件夹实际上包含框架的库,而lib文件夹保留了应用程序包含的库,并且src为其源文件。

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

#3 楼

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

#4 楼

从Rails Asset Pipeline指南:


app/assets适用于应用程序所拥有的资产,例如自定义图像,JavaScript文件或样式表。
lib/assets适用于您自己的库'真正不适合应用程序范围或跨应用程序共享的库的代码。
vendor/assets用于外部实体拥有的资产,例如JavaScript插件和CSS框架的代码。

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