【问题标题】:how do I work on a library that's included with Composer?如何处理 Composer 附带的库?
【发布时间】:2018-07-10 13:25:38
【问题描述】:

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

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

我想要的是这样的:

- some_app - vendor - my_package

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

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

我该怎么做?

【问题讨论】:

    标签: composer-php


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-06-14
      • 2018-10-04
      • 1970-01-01
      • 2014-07-23
      • 2018-11-30
      • 2023-01-18
      • 2020-03-18
      • 1970-01-01
      • 2013-01-27
      相关资源
      最近更新 更多