私有包部署靠静态生成+正确接入,必须将私有源设为"type": "composer"并显式禁用packagist.org;镜像仅加速公共包,对私有源无效。

私有包部署不靠“搭服务”,靠静态生成+正确接入;加速不是换镜像就能解决,私有源和公共镜像必须分清角色——前者管“有没有”,后者管“快不快”。
composer.json 里怎么写私有仓库才不 fallback 到 packagist.org
关键在 repositories 字段的结构和 packagist.org 的显式禁用。Composer 默认总会查 packagist.org,哪怕你只配了一个私有源。
- 必须把私有源声明为
"type": "composer",URL 指向 Satis 构建出的静态目录(如https://packages.internal/),不能是 Git 地址 - 必须加
"packagist.org": false,写在repositories数组**之外**、同级的repositories对象里(不是数组) - 如果
repositories当前是数组[],先手动改成对象{},否则composer config命令会失败或覆盖原有源 - 示例片段:
{
"repositories": {
"internal": {
"type": "composer",
"url": "https://packages.internal/"
},
"packagist.org": false
}
}
运行 php bin/satis build 总是空包或报错?检查这三处
Satis 构建失败几乎都卡在元数据解析环节,跟 Web 服务无关。
-
repositories配置里的 Git URL 必须可被构建机访问:HTTPS 方式需提前执行git config --global credential.helper store并输一次密码;SSH 方式要确保~/.ssh/id_rsa存在且权限为600 - 目标 Git 仓库根目录下必须有合法的
composer.json,且不含非法version字段(如"dev-main"或"1.2.x-dev")——Satis 会拒绝解析,删掉该字段让 Composer 自动从 Tag 推断版本 - 构建输出目录(如
web/)必须可写,且最终能通过 HTTP 访问到packages.json;若用 Nginx,确认location /未屏蔽.json文件或加了deny all
为什么换了阿里云/网易镜像,私有包还是慢甚至失败
因为镜像源只代理 public 包,对私有源完全无效。混淆这两者是最大误区。
-
composer config -g repo.packagist只影响packagist.org这个公共源,不影响你repositories里定义的任何私有composer或vcs源 - 私有包慢,90% 是 DNS 解析慢、Git over HTTPS 走代理、或私有 Git 服务器没开 shallow clone ——不是镜像问题
- 若私有源用的是
vcs类型(直接 Git 地址),它根本不会走repo.packagist配置,也绕不开你的内网延迟;这时应改用 Satis 生成的composer类型源,把包 ZIP 和元数据全拉到本地 - 验证方式:运行
composer install -vvv,看日志里私有包是从https://packages.internal/packages.json拉的,还是又去github.comclone 的
项目里怎么安全接入 Satis 私有源而不污染全局配置
别碰 -g,所有配置都应进项目 composer.json,否则 CI、新同事、Docker 构建都会不一致。
- 进项目根目录,运行:
composer config repo.internal composer https://packages.internal/(注意repo.internal是自定义键名,不是固定值) - 再手动编辑
composer.json,在repositories对象里补上"packagist.org": false - 不要用
composer config命令直接写packagist.org键——它不支持布尔值,只能手写 - 执行
composer update --lock,确保composer.lock里记录的是私有源地址,而不是 fallback 后的 packagist.org
最易被忽略的是:Satis 不支持增量更新,每次 build 都全量重扫所有 Git 仓库;如果包多、Tag 多,构建时间会线性增长,得用脚本定期清理旧 Tag 或按需触发构建,不能无脑 cron 每小时跑一次。











