Composer repositories 的 type 字段必须显式声明,否则仓库被静默跳过;type 仅支持 vcs/composer/package 三类,且需与 URL 类型严格匹配。

composer repositories 里 type 字段必须显式声明
不写 type 或写错类型,Composer 会直接跳过整个仓库配置,且不报错——这是最常被忽略的静默失败原因。
你配了 "url": "https://git.example.com/my/pkg.git" 却没写 "type": "vcs",Composer 就当这行不存在;同理,把私有 Satis 服务地址配成 type: vcs,它会尝试用 Git 协议去 clone,而不是走 HTTP API 拉包信息,最终报 Could not find package 这类模糊错误。
-
type: vcs→ 对应 Git / SVN / Mercurial 仓库地址,Composer 会 clone 并读取其中的composer.json -
type: composer→ 指向另一个提供packages.json的 Composer 仓库服务(如阿里云镜像、Satis、Private Packagist) -
type: package→ 手动声明一个包的完整元数据(name、version、dist或source),适合闭源二进制或无法托管到 VCS 的场景
为什么加了自定义源却还是从 packagist.org 装包
因为默认源没关。即使你在 repositories 里加了新源,只要没显式禁用 packagist.org,Composer 就会先查默认源,匹配成功就装,根本不会往后看你的源。
项目级关闭方式是在 repositories 数组开头加一项:{"packagist.org": false};全局关闭用 composer config -g packagist false。注意:这个 false 必须是 repositories 数组里的独立对象,不能塞在其他仓库配置里。
- 错误写法:
"repositories": [{"type": "composer", "url": "https://my-mirror.com/"}]→ 默认源仍生效 - 正确写法:
"repositories": [{"packagist.org": false}, {"type": "composer", "url": "https://my-mirror.com/"}] - 顺序很重要:前面的源优先匹配,同名包不会继续往后找
如何让某个包只从指定 Git 仓库安装
不能只靠 --repository-url 参数,它只改元数据源,不参与包发现逻辑。真正生效的方式是两步:先在 repositories 中声明该仓库,再在 require 中显式写明包名和版本(且包名必须完全一致)。
例如你想让 myorg/private-lib 从内部 GitLab 安装,就得在 composer.json 里同时写:
"repositories": [
{"packagist.org": false},
{"type": "vcs", "url": "https://git.example.com/myorg/private-lib.git"}
],
"require": {
"myorg/private-lib": "dev-main"
}
注意:dev-main 是分支名,不是 tag;Git 仓库根目录必须有合法的 composer.json,且其中 "name" 字段值必须是 "myorg/private-lib",否则 Composer 找不到匹配项。
preferred-install 和 repositories 是两回事
preferred-install 控制的是「怎么装」(dist 压缩包 or source 克隆),而 repositories 控制的是「从哪装」(哪个源找包信息)。两者不耦合,但容易混淆。
比如你设了 "preferred-install": {"myorg/private-lib": "source"},前提是该包在某个 type: vcs 仓库中被声明过,否则 Composer 根本不知道它有 Git 地址可克隆——它只会 fallback 到 dist,甚至报错找不到包。
- 私有 VCS 包默认走 source,不受
preferred-install影响(除非你显式设为dist) - 从
type: composer源拉的包,只能走 dist,--prefer-source对它无效 - 验证是否真走 source:进
vendor/myorg/private-lib/,执行ls -A | grep git,有.git目录才算成功
type、packagist.org 开关、包名一致性、Git 仓库可访问性这四点漏掉任何一个,都会导致安装行为偏离预期。尤其在 CI 环境下,SSH 权限、缓存残留、镜像同步延迟这些隐性因素,比配置本身更容易出问题。


















