Composer require本地包报“Could not find package”非网络问题,而是repositories未置根层级、url未用./或../开头且末尾带/、本地包composer.json中name/version不匹配或未git commit。

Composer 自动检测门槛高,不是你学得慢,而是默认行为对新手极不友好——它把“配置错误”伪装成“网络失败”或“找不到包”,实际卡点全在路径、name 对齐、Git 初始化和 autoload 闭环上。
为什么 composer require 本地包总报 “Could not find package”
这不是网络问题,是 Composer 根本没扫描到你的目录。三个硬性条件缺一不可:
- 主项目
composer.json的repositories必须写在最外层,格式为数组:[{"type": "path", "url": "./packages/my-utils"}];塞进require或autoload里完全无效 -
url必须是相对路径,以./或../开头,末尾不能带/("./pkg/"会静默跳过) - 本地包目录下必须有合法
composer.json,含严格匹配的"name": "acme/utils"和"version": "dev-main";且已执行git init && git add . && git commit -m "init"
本地包类找不到?autoload 没闭环
主项目的 autoload 配置对本地包完全无效,必须由本地包自己声明并触发刷新:
- 本地包的
composer.json中必须有"autoload"段,例如:"psr-4": {"Acme\Utils\": "src/"}(注意双反斜杠和末尾/) - 路径是相对于本地包根目录的,不是主项目根目录;写成
"src/Acme/Utils/"就会失效 - 改完本地包的 autoload 后,在主项目中必须运行
composer dump-autoload,否则新映射不会写入vendor/composer/autoload_psr4.php - 验证是否生效:
php -r "echo class_exists('Acme\Utils\Helper') ? 'ok' : 'fail';"输出ok才算真正通了
为什么 symlink 不生效?权限和配置都在本地包里
符号链接是否建立,不取决于主项目,而取决于本地包自己的 composer.json 和执行环境:
- 必须在本地包的
composer.json中加:"options": {"symlink": true} - Windows 用户必须以管理员身份运行终端,否则创建 symlink 失败且无任何提示
- 首次引入必须用
composer update acme/utils(不是install),因为install只读composer.lock,不走 path 解析 - 验证链接:
ls -la vendor/acme/utils(Linux/macOS)应显示->;Windows 上用dir vendorcmeutils看是否为“JUNCTION”
最容易被忽略的点:所有 name 字段大小写、连字符、斜杠全部敏感,"acme/utils" 和 "Acme/Utils" 是两个包;本地包没 git commit,dev-main 就解析失败;autoload 改了不手动 dump-autoload,类永远加载不到。











