首页 > 解决方案 > 如何处理 Composer 附带的库?

问题描述

我维护了一个包,该包旨在作为其他应用程序的库,由 Composer 管理。

我不明白我应该如何处理我的包,而没有 Composer 一直妨碍并覆盖我的工作。

我想要的是这样的:

- some_app - vendor - my_package

其中 my_package 是我控制的 git 克隆,我可以在其中创建测试分支、推送到 github 等,并且 Composer 不会覆盖它或更改当前签出的提交。

但我希望 Composer 注意到我的包的自动加载器,并考虑满足 some_app 运行的要求,以及 some_app 上的 composer 更新以正常运行。

我该怎么做呢?

标签: composer-php

解决方案


Composer支持您要求的确切功能。作为其他应用程序的插件,您不能修改任何内容vendor并期望它保留。Composer 将vendor直接从composer.json文件中的信息组成全部内容。不允许进行后处理,除非您在composer.json文件中有声明挂钩的指令。

因此,正确的方法是使用应用程序提供的机制来管理插件所需的依赖项。Symfony flex是 Composer 插件机制的一个例子;RoboPHP有一个不同的。

如果您尝试扩展的应用程序不支持允许其插件声明 Composer 依赖项,您可能会创建自己的 composer.json 文件,存储在应用程序不知道的某个位置,并使用它来生成您自己的单独vendor目录有自己的autoload.php文件。然后您可以手动包含您自己的自动加载文件,这将允许 PHP 然后包含您vendor目录中包含的任何类文件。如果您的插件的依赖项没有被主应用程序使用,并且没有出现在主应用程序的任何位置vendor目录(包括依赖项的所有依赖项,以及它们的依赖项等),那么这将起作用。但是,如果您的插件中的依赖项与主应用程序的依赖项之间存在任何重叠,那么您可能会发现此解决方案在某些时候有效,而在其他时候以难以诊断的方式严重失败。关于为什么拥有多个自动加载文件是个坏主意的解释,请参阅博客文章两个自动加载器的问题和修复 Composer 全局命令


推荐阅读