最稳方式是在 composer.json 的 repositories 中配置 type 为 path 的本地包路径,且 require 时需显式指定 @dev 或 dev-分支名;windows 需启用 config.symlink=true 才能自动同步修改。

composer.json 里怎么写 repositories 指向本地包
本地开发时想让主项目直接用还没发版的包,最稳的方式是把包路径加进 repositories,而不是靠 path 类型仓库或软链接。否则 Composer 会跳过自动加载、版本解析出错,甚至装出空 vendor。
-
type必须设为path,不是package或vcs -
url填绝对路径(推荐)或相对于composer.json的相对路径,比如../my-local-package - 本地包的
composer.json必须有合法name和version(哪怕写"dev-main"),否则主项目require时会报Could not find package xxx - 别在
repositories里加packagist.org镜像——它会覆盖默认源,导致其他包拉不到
示例:
{
"repositories": [
{
"type": "path",
"url": "../my-utils"
}
],
"require": {
"acme/my-utils": "*"
}
}
为什么 require 本地包要带 @dev 或指定分支
Composer 默认只接受稳定版本(stable),而本地 path 包没有 tag,它的版本被识别为 dev-main 或 dev-develop ——属于开发版,必须显式允许。
- 不加约束:运行
composer require acme/my-utils会提示Could not find a version of package acme/my-utils matching your minimum-stability - 正确写法之一:
composer require acme/my-utils:@dev - 更安全的写法:
composer require acme/my-utils:dev-main(和本地包composer.json中branch-alias或实际分支名一致) - 如果主项目
minimum-stability设成了dev,虽能绕过限制,但会污染整个依赖树,不推荐
composer install 后本地包没进 vendor?检查这三处
常见现象是命令跑完没报错,但 vendor/acme/my-utils 目录不存在,或者内容是空的、是旧版。本质是 Composer 没真正“链接”成功。
- 确认本地包根目录下有
composer.json,且name字段和主项目require的完全一致(包括大小写、斜杠方向) - 执行
composer show acme/my-utils,看输出是否含source: path /xxx/yyy—— 如果显示dist或根本查不到,说明没走本地源 - 删掉
composer.lock和vendor重装;lock文件缓存了源信息,不清理会导致“假装更新”
如何让本地包修改后自动生效,不用反复 composer update
Composer 的 path 类型仓库默认启用符号链接(symlink),但仅限 Linux/macOS;Windows 默认关闭,需手动配置。
- Linux/macOS 下,只要
repositories.type === "path",且文件系统支持,就会自动创建软链,改本地包代码立刻反映到主项目 - Windows 用户必须在
composer.json顶层加:"config": { "symlink": true }否则每次改完都要composer update acme/my-utils - 注意:IDE 可能不跟随软链跳转,建议在编辑器里直接打开本地包目录,而不是
vendor下的链接
路径映射是透明的,但 Composer 不监听文件变化——它只管“装的时候怎么连”,运行时就是普通 PHP 加载,没额外开销。










