如何处理Composer随附的库?

时间:2018-07-10 13:25:38

标签: composer-php

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

我不明白在没有Composer妨碍并始终覆盖我的工作的情况下如何处理我的包裹。

我想要的是这个东西

- some_app - vendor - my_package

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

但是我希望Composer注意到我的软件包具有自动装带器,并考虑其满足some_app运行的要求,以及composer在some_app上的更新才能正常运行。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

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

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

如果您尝试扩展的应用程序不支持允许其插件声明Composer依赖关系,则可以潜在地创建自己的composer.json文件,将其存储在应用程序不知道的某个位置,并使用该文件生成您的拥有自己的vendor文件的独立autoload.php目录。然后,您可以手动包含自己的自动加载文件,该文件将允许PHP然后包含vendor目录中包含的任何类文件。如果插件的依赖关系未由主应用程序使用,并且未出现在主应用程序的vendor目录中的任何位置(包括所有依赖关系及其依赖关系,等等),那么它将起作用。但是,如果插件中的依赖项与主应用程序的依赖项之间存在重叠,那么您可能会发现此解决方案在某些时候有效,而在其他时候却以难以诊断的方式严重失败。有关为何有多个自动加载文件不是一个好主意的解释,请参阅博客文章The Trouble with Two AutoloadersFixing the Composer Global Command