src
,doc
或test
文件夹,它们具有相当容易理解的内容。但是,我意识到大型项目都具有一个共同点。
lib
和vendor
文件夹虽然我一直认为它们是相同的,但它们的名称暗示包括“来自外部libraries
的第三方vendors
”。但是,在同一个项目中看到这两者意味着存在差异。我找不到任何信息,也找不到有关Google的信息,也找不到诸如Filesystem Hierarchy Standard之类的资源,尽管实际上这在某种程度上很常见实践。这是Symfony的一个更详细的示例:创建项目后,您将在项目根目录下找到一个
lib
文件夹。在此文件夹中,找到以下结构:lib
+--filter
+--form
+--…
+--vendor
+--simpletest
+--symfony
这里,
symfony
文件夹包含Symfony的所有核心。#1 楼
当我看到lib
或libraries
目录时,我会想到:库,而不是插件,模块等。
在适用的情况下,OOP而不是程序(例如PHP)
当我看到一个
vendor
目录时,我会想到:库,插件,模块,组件等。不仅是库,而且还提供第三方。
非代码的东西,例如图标集。
当我看到
lib
和vendor
目录时,我想到了一些区别: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的问题,但是解释很好而清楚,很可能扩展到其他框架/项目结构。
评论
@YannisRizos我知道它不在他们的来源中。但是,一旦开始处理项目并生成模块,您将得到lib / vendor以及vendor的其他目录。而且它们不是唯一的。 “每个人都可以选择任何目录结构”是的,谢谢。每个人都可以根据自己的意愿进行编码。如果我想将src称为“ woudzigouga”,我可以。我不是在问我是否可以,而是为什么其他认真而著名的人会做一些看起来很好的做法。除了显而易见的是,lib拥有核心库(绝对必要的库,或者由与框架相同的作者构建的库),而供应商拥有第三方库,我认为没有其他合理的区别。出于各种原因,这种区别在某种程度上是很重要的,并且作为通用做法是有意义的。
顺便说一句,您能在评论中添加对问题本身的澄清吗?
@YannisRizos有什么澄清?证明我的问题的Google Code搜索不完全是伪造的?如果您可以详细说明区别所重要的“各种原因”,并解释其中包括的第三方如何比其他一些更为重要,那么这实际上会有所帮助。如果包含了第三方,则有一个原因,除非维护者是不称职且包含批处理的代码。
您可以触摸/ lib /中的内容,而不能触摸/ vendor /
中的内容