如何使用composer来管理框架中的自定义和核心库

时间:2014-04-06 09:00:24

标签: php composer-php

我有一个小的定制mvc框架,我用它来构建网站。我也使用了很多第三方库。其中一些是"核心"我的框架的库。我现在想用Composer来管理这些库。

例如,我的框架默认使用Smarty模板引擎和名为Monolog的Logger类。

另一方面,使用我的框架的用户/开发人员也可以自己安装第三方库。就像他们想要使用像SwiftMailer这样的东西。或者使用Twig模板引擎代替Smarty。他们可以很容易地做到这一点。

目前我的应用程序结构如下:

/htdocs
  /System
    /Vendors
      /Smarty
      /Monolog
  /Controllers
  /Models
  /Views
  /Vendors
    /Swiftmailer
    /Twig

所有"核心"库放在System/Vendor目录中。该框架默认使用这些库。

用户可以安装其他库,它们将被放置在Web文件夹根目录中的Vendors目录中。

如果我使用作曲家,我可以轻松安装SwiftMailerTwig等库。 Composer会自动将这些库安装到htdocs/Vendors目录中。

但是htdocs/System/Vendors目录中的库呢?我可以使用composer管理两个Vendors目录吗?或者我应该安装两个作曲家?那么一个在我的web目录(htdocs)的根目录中,一个在System目录中?

或者我不应该使用composer来处理System/Vendors文件夹中的库?

我不确定如何管理两个Vendors目录。这是什么最好的做法?

2 个答案:

答案 0 :(得分:1)

我建议只使用一个供应商文件夹,为什么要分开它们?

我还想建议将框架本身与项目分离。我会为框架创建一个包,并且需要在项目中创建。 Composer将负责所有依赖项,并且将在项目的vendor目录中为项目安装所有内容。

答案 1 :(得分:1)

您的代码属于您的版本控制系统,应该composer.json声明您的代码自动加载 - 并且应该提及您是否还需要第三方代码 - 以及所需的版本。

您不应在自己的代码库中包含第三方代码。如果你这样做,事情变得更加复杂。

例如,如果有人使用您的框架,并决定使用不同版本的Smarty而不是内部,则不应检测到此版本冲突。因此,如果您自己仅为Smarty定义自动加载,则不会阻止任何人将Smarty依赖项包含在自己的软件中。现在可能发生以下两种情况之一:要么首先执行自己的Smarty自动加载,要么首先执行其他Smarty自动加载。无论哪种方式,事情都会破裂而不会留下什么问题。在最坏的情况下,具有要求版本号的功能的类被正确加载,而其他任何东西都搞砸了......

所以正确的方法是只使用Composer嵌入这些第三方库,但不要将它们包含在您自己的代码库中。这也将减少框架的下载大小。从这开始,世界将会看到您已经使用了哪些库,并且Composer可以检测版本冲突并提醒尝试混合不兼容版本的其他开发人员。或者可以帮助只抓取该库的一个版本而不是两个版本(缩小文件大小,自动加载时没有歧义)。