composer-php - 如何处理 Composer 附带的库?
问题描述
我维护了一个包,该包旨在作为其他应用程序的库,由 Composer 管理。
我不明白我应该如何处理我的包,而没有 Composer 一直妨碍并覆盖我的工作。
我想要的是这样的:
- some_app
- vendor
- my_package
其中 my_package 是我控制的 git 克隆,我可以在其中创建测试分支、推送到 github 等,并且 Composer 不会覆盖它或更改当前签出的提交。
但我希望 Composer 注意到我的包的自动加载器,并考虑满足 some_app 运行的要求,以及 some_app 上的 composer 更新以正常运行。
我该怎么做呢?
解决方案
Composer不支持您要求的确切功能。作为其他应用程序的插件,您不能修改任何内容vendor
并期望它保留。Composer 将vendor
直接从composer.json
文件中的信息组成全部内容。不允许进行后处理,除非您在composer.json
文件中有声明挂钩的指令。
因此,正确的方法是使用应用程序提供的机制来管理插件所需的依赖项。Symfony flex是 Composer 插件机制的一个例子;RoboPHP有一个不同的。
如果您尝试扩展的应用程序不支持允许其插件声明 Composer 依赖项,您可能会创建自己的 composer.json 文件,存储在应用程序不知道的某个位置,并使用它来生成您自己的单独vendor
目录有自己的autoload.php
文件。然后您可以手动包含您自己的自动加载文件,这将允许 PHP 然后包含您vendor
目录中包含的任何类文件。如果您的插件的依赖项没有被主应用程序使用,并且没有出现在主应用程序的任何位置vendor
目录(包括依赖项的所有依赖项,以及它们的依赖项等),那么这将起作用。但是,如果您的插件中的依赖项与主应用程序的依赖项之间存在任何重叠,那么您可能会发现此解决方案在某些时候有效,而在其他时候以难以诊断的方式严重失败。关于为什么拥有多个自动加载文件是个坏主意的解释,请参阅博客文章两个自动加载器的问题和修复 Composer 全局命令。
推荐阅读
- jenkins - 为什么我的 Jenkins 步骤没有重试,而是在未达到时间限制时抛出超时错误?
- google-cloud-platform - 相当于 GCP 中的 AWS Route53 服务(云 dns?)
- python - 如何在pygame中发射子弹?
- python - 如何用 numpy 构造一个秩数组?(什么是秩数组?)
- sql - 将作为字典列表的 json 转换为 Postgresql 中的列/行格式
- ios - 如何在 SwiftUI 中的两个视图模型之间共享已发布的模型?
- reactjs - 是否有任何替代方法可以避免在服务器端下一个 js 上未定义 localStorage 这个错误?
- python - 我写在一个文件上并读取它但是当我再次运行时似乎
- sql - 时间窗口定义的开始/停止事件中列的总和值
- amazon-web-services - AWS 多站点、一个实例、多个端口