根本原因是composer默认只查packagist.org,未配置repositories则不访问私有仓库;必须在composer.json中以数组形式声明type和url、设auth.json权限为600、禁用packagist.org、确保包名与私有包name字段完全一致且大小写敏感。

ThinkPHP 项目要装内部自研扩展包,composer require 报 Could not find package,根本原因不是 TP 本身限制,而是 Composer 根本没去你私有仓库找——它默认只认 packagist.org,不配置 repositories 就等于没告诉它“门在哪儿”。
为什么 composer.json 的 repositories 必须手动加,且必须是数组
Composer 不会扫描 Git 服务器或内网目录,它只按 composer.json 里 repositories 字段声明的地址去拉元数据。漏写、写成对象(如 {"my-repo": {...}})、或写错位置(比如塞进 require 里),都会导致静默失败——不报错,但包永远找不到。
-
repositories必须是 JSON 数组,每一项是一个对象,含type和url - 若用 Satis 或私有 Packagist 服务,
type填"composer";若直连 GitLab/GitHub 私有库,type填"vcs" - URL 要指向仓库根(如
https://gitlab.internal/group/pkg),不能带.git后缀,也不能是某个 tag 页面 - 多个仓库时顺序决定优先级:前面匹配上了,后面的同名包就直接忽略
auth.json 权限设错,等于没配认证
HTTPS 私有 Git 仓库(如 GitLab)需要 http-basic 凭据,但 Composer 只从权限为 600 的 auth.json 读取,其他任何方式都会被跳过。
-
auth.json必须和composer.json同级,内容形如:{"http-basic": {"gitlab.internal": {"username": "deploy", "password": "xxx"}}} - Linux/macOS 下必须运行
chmod 600 auth.json;Windows 用户要确认文件无隐藏扩展名(如auth.json.txt) - 别把 token 拼进 URL(如
https://token@...),这已被弃用且不安全 - CI 环境建议用
COMPOSER_AUTH环境变量注入 JSON,避免挂载文件失败
vcs 类型下,版本号只认 Git tag,不看 composer.json 的 version 字段
你在私有包的 composer.json 里写了 "version": "1.0.0" 没用。Composer 解析 vcs 包时,只认 Git 的 tag 名和分支名。
- 想用
"^1.0",就必须打v1.0.0或1.0.0这样的语义化 tag(注意前缀v可选,但需统一) - 没打任何 tag 时,唯一可用的是
dev-main(或dev-master),且需在项目中设"minimum-stability": "dev" - 分支名如
feature/login对应虚拟版本dev-feature-login,require 时得写全 - Satis 构建后也要确认该 tag 已被索引:打开
https://satis.internal/packages.json搜索包名,看对应版本是否存在
require 的包名必须和私有包 composer.json 的 name 字段一字不差
大小写敏感,vendor 名和 package 名之间用 / 分隔,不能多空格、不能少斜杠。写错一个字符,Composer 就当它是另一个包。
- 私有包自身
composer.json里是"name": "company/utils",你就得composer require company/utils - 如果私有包用了大写
"Company/Utils",那require也必须严格大写 - 别在
require里加dev-前缀来“绕过稳定性检查”,除非你真打算用开发版;稳定版必须对应真实 tag - 执行前先
composer clear-cache,否则可能读到旧缓存,导致明明改了配置却仍报错
最常被忽略的一点:私有仓库配置生效后,composer install 或 update 仍可能拉错包——因为默认 packagist.org 还开着,双源并行时,同名包若在 Packagist 上存在,Composer 会优先选它。必须显式禁用:"packagist.org": false 写进 repositories 数组里,或者用 composer config -g packagist false 关全局源。











