“Could not find package”主因是repositories未置根级、path路径非相对格式、本地包name不匹配或未显式指定版本;需验证readlink软链指向、dump-autoload刷新加载并检查autoload配置。

composer require 报 “Could not find package” 是路径没对上,不是网络问题
Composer 不会主动扫描你硬盘上的任意目录,它只认 repositories 配置里明确声明、且路径和包名都严格匹配的本地目录。静默失败是常态——不报错、不提示,直接跳过该仓库。
-
repositories必须写在项目根composer.json的顶层(和require同级),不能塞进extra、autoload或其他字段里 -
url值必须以./或../开头,绝对路径(如/home/user/pkg)、file://、波浪号(~/pkg)全部无效 - 本地包目录下必须有合法的
composer.json,其中name字段(如"acme/utils")要和你在composer require时写的**完全一致**:大小写、斜杠、连字符一个都不能差 - 如果本地包没写
version,composer require acme/utils会失败;得显式写composer require acme/utils:dev-main,并确保项目已设"minimum-stability": "dev"
装上了但 Class not found?autoload 映射根本没更新
路径对了、包也进了 vendor/(其实是软链接或复制体),不代表类能被自动加载。Composer 只负责“让包存在”,autoload 是另一套独立机制。
- 确认本地包自己的
composer.json里写了正确的autoload,例如:"psr-4": {"Acme\Utils\": "src/"}—— 注意双反斜杠和路径末尾不带斜杠 - 运行
composer dump-autoload(开发阶段别加-o),否则新映射不会写入vendor/composer/autoload_static.php - 如果测试类在
tests/下,且用了autoload-dev,映射必须带末尾反斜杠:"Acme\Tests\": "tests/",少一个就断掉 - 别在
require 'vendor/autoload.php'之前就new类,也别用相对路径手动引入 autoload 文件
怎么验证 path 仓库真生效了?别只看 vendor 目录
看到 vendor/acme/utils 有内容,不等于 path 仓库起作用了。得验证底层链接和运行时加载是否真实指向本地目录。
- Linux/macOS 下运行:
readlink vendor/acme/utils,输出应为你的本地路径(如../../packages/utils) - Windows 下用:
dir vendorcmeutils,看是否显示“符号链接”或指向真实目录,而不是普通文件夹 - 如果输出是空、报错、或显示绝对路径,说明
url写错、权限不足、或本地包没git init(Composer 要求 path 类型包至少有一个 commit) - 临时加个
die(__FILE__);到本地包某个类的构造函数里,跑一次脚本,看实际加载的是 vendor 下的副本还是你本地的源文件
vendor-dir 改了,autoload 引入路径也要同步改
改了 config.vendor-dir 后,require 'vendor/autoload.php' 会失效——因为生成的 autoload.php 是硬编码路径的,它不会自动适配新位置。
- 要么把引入语句改成:
require __DIR__ . '/lib/vendor/autoload.php';(推荐,路径动态计算) - 要么用环境变量
COMPOSER_VENDOR_DIR=lib/vendor,但它不写入composer.lock,CI 环境容易出错 - Web 入口还要检查
open_basedir是否限制了新路径,否则require会静默失败 - 中途修改
vendor-dir后,必须先rm -rf vendor再composer install,否则旧包残留会导致路径错乱
路径写错、autoload 没刷新、引入语句没更新——这三处最容易被当成“Composer bug”反复折腾,其实每一步都有确定的验证方式。











