需配置私有仓库源:执行 composer config repositories.my-private type composer --url http://repo.internal/,确保 URL 可访问、返回 200 状态码的 packages.json,且 satis 构建时包含对应包并清除 Composer 缓存。

怎么让 composer install 装到内网包而不是去 packagist.org?
关键不是改命令,而是改配置——让 Composer 知道「该去哪儿找包」。默认它只认 packagist.org,内网包得手动加一个私有仓库源。
最常用且可靠的方式是用 composer config 在项目或全局加 repositories 配置:
- 项目级(推荐):
composer config repositories.my-private type composer,然后跟上内网仓库地址(如http://repo.internal/) - 必须指定
type为composer,不能写成vcs或package,否则不支持自动发现和版本解析 - 地址必须能被运行
composer install的机器直接访问(DNS 可解析、无认证拦截、HTTP 状态码 200) - 如果仓库启用了 Basic Auth,得在 URL 里带凭证:
https://user:pass@repo.internal/,否则会卡在元数据拉取阶段
内网仓库用什么技术搭?选 satis 还是 toran proxy 还是自建 HTTP 服务?
satis 是最轻量、最可控的选择,尤其适合纯内网、不需用户交互的场景;toran proxy 已停止维护,别踩;自建 HTTP 服务(比如 Nginx + 静态 JSON)可行但容易漏掉版本约束校验逻辑。
satis 的核心价值在于:它把 Git 仓库打成标准 Composer 元数据(packages.json),并生成带完整 dist 和 source 的压缩包索引——这正是 composer install 下载时依赖的结构。
- 部署前确认 PHP 版本 ≥ 7.4(
satis1.0+ 不再支持 7.2) -
satis.json里必须写明name(任意字符串)、homepage(可填内网地址)、repositories列表(指向你自己的 Git 地址,如git@git.internal:team/pkg-a.git) - 构建后生成的
packages.json必须放在 Web 根目录下,且路径要和composer config repositories.xxx.url中的值完全一致(比如配的是http://repo.internal/,那访问http://repo.internal/packages.json就得返回内容)
为什么 composer require vendor/name 报错 “Could not find package”?
不是包名写错了,大概率是仓库没生效,或者包没被 satis 收录进索引。
先验证仓库是否被识别:composer config --list | grep repositories,看输出里有没有你加的源;再验证元数据可访问:curl -I http://repo.internal/packages.json,状态码必须是 200,且响应头含 Content-Type: application/json。
- 常见坑:Git 仓库的
composer.json缺少name字段(格式必须是vendor/name,不能是name单字段) - 另一个坑:
satis build后没清 Composer 缓存,本地仍读旧索引,执行composer clear-cache再试 - 如果包有
dev-master分支但没打 tag,satis默认不收录,得在satis.json加"require-all": true或显式列出分支
怎么控制哪些包走内网、哪些仍走官方源?
Composer 默认合并所有仓库,按顺序匹配:先查第一个仓库有没有这个 vendor/name,有就用,没有才查下一个。所以顺序决定优先级。
把内网仓库放 repositories 数组最前面,就能确保同名包优先走内网;但要注意:一旦内网仓库声明了某个 vendor/name,哪怕它只提供 v1.0.0,Composer 就不会再向 packagist.org 查 v1.1.0 —— 它认为「这个 vendor 已被接管」。
- 规避冲突:内网仓库的
vendor前缀最好和官方区分开,比如统一用internal-开头(internal-myapp/logger) - 如果真要混用同一 vendor 名,必须保证内网仓库的
packages.json包含完整版本列表(包括从 packagist 同步过来的),这通常需要satis配置repositories同时包含内网 Git 和packagist.org镜像 - 临时调试可用
composer show vendor/name --all,看它实际从哪个源加载的版本信息
最难调的永远不是搭建步骤,而是仓库 URL 的协议、路径、权限三者咬合是否严丝合缝——少一个斜杠、多一个重定向、DNS 解析慢半秒,都可能让 composer update 静默失败或回退到空结果。










