我有一个小的定制mvc框架,我用它来构建网站。我也使用了很多第三方库。其中一些是"核心"我的框架的库。我现在想用Composer
来管理这些库。
例如,我的框架默认使用Smarty
模板引擎和名为Monolog
的Logger类。
另一方面,使用我的框架的用户/开发人员也可以自己安装第三方库。就像他们想要使用像SwiftMailer
这样的东西。或者使用Twig
模板引擎代替Smarty
。他们可以很容易地做到这一点。
目前我的应用程序结构如下:
/htdocs
/System
/Vendors
/Smarty
/Monolog
/Controllers
/Models
/Views
/Vendors
/Swiftmailer
/Twig
所有"核心"库放在System/Vendor
目录中。该框架默认使用这些库。
用户可以安装其他库,它们将被放置在Web文件夹根目录中的Vendors
目录中。
如果我使用作曲家,我可以轻松安装SwiftMailer
和Twig
等库。 Composer会自动将这些库安装到htdocs/Vendors
目录中。
但是htdocs/System/Vendors
目录中的库呢?我可以使用composer管理两个Vendors
目录吗?或者我应该安装两个作曲家?那么一个在我的web目录(htdocs)的根目录中,一个在System
目录中?
或者我不应该使用composer来处理System/Vendors
文件夹中的库?
我不确定如何管理两个Vendors
目录。这是什么最好的做法?
答案 0 :(得分:1)
我建议只使用一个供应商文件夹,为什么要分开它们?
我还想建议将框架本身与项目分离。我会为框架创建一个包,并且需要在项目中创建。 Composer将负责所有依赖项,并且将在项目的vendor
目录中为项目安装所有内容。
答案 1 :(得分:1)
您的代码属于您的版本控制系统,应该composer.json
声明您的代码自动加载 - 并且应该提及您是否还需要第三方代码 - 以及所需的版本。
您不应在自己的代码库中包含第三方代码。如果你这样做,事情变得更加复杂。
例如,如果有人使用您的框架,并决定使用不同版本的Smarty而不是内部,则不应检测到此版本冲突。因此,如果您自己仅为Smarty定义自动加载,则不会阻止任何人将Smarty依赖项包含在自己的软件中。现在可能发生以下两种情况之一:要么首先执行自己的Smarty自动加载,要么首先执行其他Smarty自动加载。无论哪种方式,事情都会破裂而不会留下什么问题。在最坏的情况下,具有要求版本号的功能的类被正确加载,而其他任何东西都搞砸了......
所以正确的方法是只使用Composer嵌入这些第三方库,但不要将它们包含在您自己的代码库中。这也将减少框架的下载大小。从这开始,世界将会看到您已经使用了哪些库,并且Composer可以检测版本冲突并提醒尝试混合不兼容版本的其他开发人员。或者可以帮助只抓取该库的一个版本而不是两个版本(缩小文件大小,自动加载时没有歧义)。