pre_package_install是唯一安全修改dist url的时机,需同步调用setdisturl()、setdisttype()和setdistshasums(),缺一不可;否则校验失败或回退至vcs拉取。

PRE_PACKAGE_INSTALL 事件是唯一安全修改 dist URL 的时机
只有 PRE_PACKAGE_INSTALL 和 PRE_PACKAGE_UPDATE 事件允许你修改 Package 对象的 dist 配置;用 POST_* 事件改,Composer 已经开始下载,改了也白改。
关键限制:你不能“覆盖”原始包元数据,而是得在事件回调里拿到 $event->getOperation()->getPackage(),再调用它的 setDistUrl()、setDistType()、setDistShaSums() —— 这三者必须一起设,缺一不可。
- 只调
setDistUrl()不设shasum→ 报错Invalid archive signature - 不设
dist.type→ Composer 可能 fallback 到 Git clone,绕过你的 URL - 新 URL 返回的 ZIP 内容必须和原包一致,否则校验失败(镜像服务必须返回相同
sha256)
pre-file-download 事件更适合全局镜像或加认证头
pre-file-download 在每次 HTTP 下载前触发,作用对象是原始 URL 字符串,不涉及包元数据解析,适合做无侵入式拦截。
它比 PRE_PACKAGE_INSTALL 更轻量,也更通用:不仅能改 dist 包地址,还能改 GitHub raw 文件、自定义脚本 URL、甚至 Packagist 的 packages.json 请求。
- 用
$event->setProcessedUrl()替换域名(如github.com→ghproxy.com) - 用
$event->getHttpDownloader()->setAuthentication()给私有源加 token - 注意:它不改变
composer.lock里记录的原始 URL,下次 install 若没插件仍走原地址
别碰 repositories 配置,用 Config::merge 注入镜像更可靠
想让所有包都走内网镜像?别在每个包上 patch URL,直接改 Composer 运行时仓库配置。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
插件里通过 $composer->getConfig()->merge() 动态注入 repositories,效果等同于手动执行 composer config repo.packagist composer https://xxx/,但无需用户干预。
- 必须显式指定
"type": "composer"和以/结尾的url - 注入后,
packages.json请求走新地址,dist URL 由镜像站自动重写,你不用操心 shasum 同步 - 项目级
repositories字段会覆盖这个设置,所以要检查composer.json是否已声明仓库
replace 字段不是运行时开关,别指望它动态切换包
replace 只影响依赖图计算阶段,install 完成后就失效了。它不会卸载旧包,也不改变类加载路径,更不参与运行时逻辑。
所谓“中文插件”“按环境启用 SDK”,本质是运行时行为,必须靠接口 + 工厂 + 配置驱动,和 Composer 的 replace 毫无关系。
-
"replace": {"old/package": "*"}只会让 Composer 在下次update时跳过安装old/package - 已存在的
old/package不会自动删,其他包若还 require 它,它照样被拉进来 - 真正要替换实现,得自己定义
MyApp\Payment\GatewayInterface,再按配置 new 具体类
最易被忽略的一点:无论用哪个事件,新 URL 返回的内容必须和原始包完全一致。镜像服务若没同步 shasum 或压缩包结构有差异,Composer 就会拒绝安装——这不是网络问题,是校验失败。










