答案:必须先在项目composer.json的repositories中配置path源,再执行composer require;否则Composer无法发现本地包。需确保repositories为数组格式、url为相对路径、本地包含合法composer.json且name一致,并用dev-main等分支名指定版本。

composer require 不能直接写路径,必须先配 repositories
你执行 composer require vendor/name:dev-main 报 “Could not find package”,不是网络问题,而是 Composer 根本没“看见”你的本地目录。它只从 repositories 数组里找源,require 字段只负责声明“我要谁”,不负责“去哪找”。
正确做法是:在项目根目录的 composer.json 中,手动添加 repositories 数组(哪怕只有一个条目),格式必须是数组,不能是对象:
{
"repositories": [
{
"type": "path",
"url": "../my-package"
}
],
"require": {
"vendor/name": "*"
}
}
-
url必须是相对路径(从当前composer.json所在位置算起),避免用~/、$HOME或绝对路径——Windows 上极易静默失败 -
url指向的是**目录**,不是composer.json文件本身 - 本地包目录下必须存在合法的
composer.json,且其中name字段(如"vendor/name")要和require里写的完全一致(大小写敏感)
本地改代码不生效?默认是复制,不是软链接
执行 composer install 或 composer update vendor/name 后,你看到的 vendor/vendor/name 默认是复制出来的副本。改 ../my-package/src/Helper.php,项目里不会变。
要实现“改即生效”,必须显式启用符号链接:
- 在
repositories条目里加"options": {"symlink": true} - Linux/macOS 通常支持;Windows 需开启“开发者模式”或以管理员权限运行命令行,否则
symlink创建会失败且无提示 - 改完本地包后,必须运行
composer update vendor/name(不是dump-autoload),才会重建链接 - 验证是否成功:
ls -la vendor/vendor/name应显示箭头指向源目录;Windows 用户用dir vendor\vendor\name看是否为“快捷方式”类型
版本号写错是高频错误,dev-main 不是可选项而是强制要求
path 类型仓库下,Composer 忽略本地包 composer.json 中的 version 字段,只认当前 Git HEAD 所在分支名。因此:
- 不能写
"1.0.0"、"^2.0"或留空——这些都会导致匹配失败 - 必须用
"dev-main"、"dev-develop"或"dev-feature-x"这类分支名形式 - 如果本地包还没初始化 Git 仓库,至少得有
"version": "dev-main",且require里对应写"dev-main" - 临时覆盖版本可用
"options": {"versions": {"vendor/name": "dev-feature-x"}},但仅对当前配置生效
配完不生效?检查这三处最容易被忽略的地方
常见“配了但没反应”的原因往往不在语法,而在路径与上下文:
-
repositories必须写在**项目根目录**的composer.json里,不能写在本地包自己的composer.json中 - 本地包目录下若没有
composer.json,或该文件有 JSON 语法错误、缺name字段,Composer 会跳过该仓库,且不报错也不提示 - 执行
composer install前,如果之前没 run 过composer require或composer update,vendor 里什么都不会有——path 仓库不支持install自动发现,必须先声明再更新


















