私有仓库需显式配置repositories数组,每项含type和url键,type常用"composer",url为http可访问地址;name须为小写vendor/name格式;require与require-dev须严格区分;autoload修改后需重装包或手动dump-autoload。

repositories 字段必须显式声明,且 type 和 url 不能颠倒
私有仓库不是靠改 Packagist 镜像实现的,而是通过 repositories 字段告诉 Composer:“去哪找包”。它是个数组,每个项必须是对象,且必须含 type 和 url 两个键——顺序不重要,但缺一不可。
常见错误现象:composer update 报错 Could not find package xxx at any version,实际是因为 repositories 写成了字符串、漏了 type,或 url 指向了一个没启用 Satis/Satis-like 服务的静态目录。
-
type只能是"composer"(推荐)、"vcs"(Git/SVN)、"package"(单包硬编码)之一;私有仓库几乎都用"composer" -
url必须是可被 HTTP GET 访问的地址,结尾不加/packages.json——Composer 会自动拼接 - 多个仓库按数组顺序从左到右查,越靠前优先级越高;别把 Packagist 放最前再加私有源,否则私有包永远不命中
- 本地测试时,
url可以是"http://localhost:8000",但确保该服务已启动并返回有效 JSON
name 字段必须合规,否则私有包 install 直接失败
哪怕只是内部项目,只要进了 repositories,所有被 require 的包都得过 Composer 的 name 校验。写错 name 不会报“仓库配置错”,而是在 composer install 阶段卡住,提示 Invalid package name "xxx"。
合规格式只有一条:必须是 vendor/name 小写两段式,中间一个斜杠,仅允许字母、数字、短横线(-),不能有下划线、点、大写字母或中文。
- 正确示例:
"myorg/my-utils"、"acme-api-client" - 错误示例:
"MyOrg/MyUtils"(大写)、"my_org/utils"(下划线)、"myorg.utils"(点号)、"myorg/my utils"(空格) - 如果用 Git 仓库(
type: "vcs"),name必须和repositories中声明的包名完全一致,否则 Composer 找不到匹配项
require 和 require-dev 要严格区分,CI 环境尤其敏感
私有仓库里的包,其 require 是运行时强依赖,require-dev 是开发期工具链。但在 CI 流水线里,这两者混用会直接导致 composer install --no-dev 失败——因为锁文件里可能残留了 dev 包引入的间接依赖版本。
典型问题:你在私有包 A 的 require-dev 里写了 "phpunit/phpunit": "^10.0",它又依赖 symfony/console: ^6.4;而主项目 require 里是 "symfony/console": "^5.4"。本地 composer update 能过,但 CI 执行 --no-dev 时,Composer 发现锁文件里记着 symfony/console: 6.4.x,却不在主项目的 require 允许范围内,于是拒绝安装。
- 判断原则:这个包是否在
src/或bin/里被new、use或include?是 → 放require;只出现在tests/或phpstan.neon里?→ 放require-dev - CI 脚本务必加
--no-dev --prefer-dist,避免本地 vendor 干扰 - 用
composer why-not vendor/package:version快速定位冲突来源
autoload 配置错位会导致类找不到,且 dump-autoload 不修复路径错误
私有包的自动加载规则写在自己的 composer.json 里,不是主项目的。很多人改完私有包的 autoload 后只在主项目跑 composer dump-autoload,结果类还是 Class not found——因为 Composer 只重新生成主项目的 autoload 文件,不会重扫 vendor 下私有包的映射。
真正生效的方式只有两个:composer update vendor/private-package(强制重装该包),或删掉 vendor/vendor/private-package 后再 composer install。
-
psr-4映射的 namespace 必须以结尾,例如"App\": "src/";Windows 下双反斜杠是必须的,不是转义符 -
files列表里的路径是相对于包根目录的,比如"src/helpers.php",不是"vendor/myorg/my-utils/src/helpers.php" - 改了
autoload后,必须验证:进vendor/myorg/my-utils目录,手动执行composer dump-autoload -o,再回到主项目composer install
私有仓库配置最常被忽略的其实是 minimum-stability 和 prefer-stable 的组合效果——它们作用于整个项目,不是单个仓库。如果你的私有包 tag 是 v1.0.0-beta,但主项目设了 "prefer-stable": true,Composer 就会跳过它,哪怕仓库 URL 完全正确。











