composer不支持开箱即用的本地dist镜像,需通过插件重写dist.url并搭配本地http服务及仿packagist的metadata索引;已有composer.lock会强制使用原始dist地址,须清缓存、删vendor与lock后重装。

Composer 本身不提供“本地 dist 镜像”这种开箱即用的机制——它默认只从远程 dist.url 下载 ZIP/TAR 包,而这个 URL 是由包的元数据(packages.json)决定的。想让本地目录充当 dist 源,必须绕过默认行为,靠手动干预或插件重写。
为什么直接改 repositories.type 为 path 不行
path 类型仓库只用于开发中本地包的符号链接式加载,它:
- 不生成
dist字段,composer install --prefer-dist会直接跳过它,转而尝试远程下载 - 不参与版本解析,
^2.0这类约束无法匹配到本地目录里的任意子版本 - 不会重写任何
dist.url,所以对已发布的包(比如monolog/monolog)完全无效 - 一旦项目移出该路径,整个依赖链就断了——这不是镜像,是硬依赖
真正生效的 dist 本地化方式:强制重写 dist.url
核心思路是让 Composer 把原本指向 GitHub/GitLab 的 dist.url 替换成你本地 HTTP 服务的地址。这需要两步:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 启动一个本地静态文件服务器(如 Python 的
python3 -m http.server 8000),把所有 ZIP 包放进去,确保能通过http://localhost:8000/xxx.zip访问 - 用插件或钩子劫持
dist.url生成逻辑。阿里云镜像插件支持该能力,但需显式启用:composer global require aliyuncs/composer-mirror-plugincomposer config -g extra.enable-dist-url-rewrite true - 再配合自定义
repositories指向你的本地服务:composer config -g repos.my-local composer http://localhost:8000/metadata/(注意:这个/metadata/目录下得有仿 Packagist 格式的packages.json,且每个包的dist.url必须指向http://localhost:8000/xxx.zip)
已有 composer.lock 时,本地 dist 配置仍不生效?
因为 composer.lock 里硬编码了原始 dist.url 和 dist.shasum,哪怕你改了全局配置或插件,Composer 仍优先按 lock 文件执行。必须:
- 删掉
vendor/ - 删掉
composer.lock - 运行
composer clear-cache - 再执行
composer install -vvv,观察日志里所有Downloading行是否都来自localhost:8000
真正的难点不在配置命令,而在维护那个本地 packages.json ——它得精确模拟 Packagist 的索引结构、版本映射和 dist URL 生成规则。多数团队最终发现:不如用私有 Packagist 工具(如 Satis 或 Private Packagist),它们原生支持 dist 托管和自动元数据生成,而不是在本地 HTTP 服务上反复 patch。










