【发布时间】:2014-04-16 04:17:58
【问题描述】:
给定项目根目录下的以下目录:
- app/,静态资源和类映射项目代码的组合
- src/,配置为加载命名空间的 PHP 代码
- vendor/,由 composer.json 管理的包
不管我碰巧使用的是什么框架,将src 目录用于旨在在项目之外使用的可移植代码是否正确,或者这是vendor 目录的作用?
将src 目录用于要共享的代码是否可能会出现任何问题?
【问题讨论】:
标签: php composer-php
给定项目根目录下的以下目录:
不管我碰巧使用的是什么框架,将src 目录用于旨在在项目之外使用的可移植代码是否正确,或者这是vendor 目录的作用?
将src 目录用于要共享的代码是否可能会出现任何问题?
【问题讨论】:
标签: php composer-php
这似乎是一种合理的设计方法。 Composer 允许您通过将自己的类自动加载到目录中然后在 composer.json 中引用它来做到这一点。请参阅此问题了解如何:Using Composer's Autoload
但是,这不会处理 src/ 下代码的版本控制。如果您要单独发布此内容,可能值得学习how to make your library installable through Composer,一旦您将其签入某个地方的 Git 存储库,请像这样引用它:
"require": {
"me/testlib": "1.0.*"
}
"repositories": [
{
"type": "vcs",
"url": "https://github.com/username/hello-world"
}
]
当然,那么您将维护多个源代码树,一个用于您的项目,一个用于每个库,但这是件好事,对吧? (“关注点分离”。)
【讨论】:
vendors 之外?
vendors/ 是 composer 安装东西的地方。不要把你自己的东西放在那里,除非你按照我的建议通过作曲家从回购中得到它。而且我不确定我是否理解您的问题,但我认为一个合适的答案是“我建议不要将您自己的库与您的程序放在同一个源代码树中”。
src/ 目录仍然是项目级别并且特定于整个解决方案:开发人员不打算在项目之间手动复制整个目录以进行代码重用,而应该只是为 @ 制作一个包987654327@?
在一般情况下,您的方法看起来是有效的。
但是,如果app 或其他任何地方的数据量超过src 中的可用代码量,它将变得无效。换句话说:如果您只在 src 中托管大约一个共享课程,并且在 app 中托管该课程不需要的 1 GB 资产,那么将其设为库将是愚蠢的。
但是在这种情况下,很容易将该类单独移动到作曲家库中并再次包含它。由于自动加载,该类仍然存在(尽管文件更改了它的位置)并且可以在其他代码中使用。即使该类被移动,任何其他需要全部资产的软件都将继续工作。
将代码移入库时,可能值得考虑的是,通常越小越好,但太小则毫无价值。你不想require 一个单独的类 - 但是具有相同主题的合理的类集合是一个很好的候选人。
【讨论】:
src是很多库的共同选择,tests就在它旁边。我不明白为什么这会很糟糕 - 我自己也在使用它。
vendor 是 Composer 放置 other 代码的地方,而不是你的。 src 是您可以放置您的 代码并通过定义composer.json 文件以允许自动加载并包含该代码来使其可供他人使用的地方。因此,如果您询问的项目在其他地方被使用,只有这样代码才会与您的项目依赖项一起位于 vendor 文件夹中(现在将在您自己的 vendor 文件夹中)。