Composer没有内置link命令,需用path仓库类型配合dev-main等非稳定版本约束才能触发软链接;稳定版本强制复制,且Windows下需手动dump-autoload更新自动加载。

为什么 composer link 不起作用
Composer 本身没有内置的 composer link 命令,直接运行会报错 Command "link" is not defined。这是新手最常卡住的第一步——误以为 Composer 原生支持软链接管理。实际要达成本地包开发与项目实时联动,得靠 path 仓库类型 + repositories 配置,再配合 require 的版本约束触发 symlink 行为。
path 仓库必须用 "@dev" 或 "dev-main" 才能软链接
Composer 只有在安装 非稳定版本(即带 -dev 后缀或使用 dev- 分支别名)时,才会对 path 类型仓库创建符号链接,而不是拷贝副本。稳定版本(如 "1.0.0")永远走复制逻辑。
- 在项目根目录的
composer.json中添加:
{
"repositories": [
{
"type": "path",
"url": "../my-local-package"
}
],
"require": {
"vendor/my-local-package": "dev-main"
}
}
-
../my-local-package必须包含合法的composer.json,且其name字段需与require中一致 - 执行
composer install或composer update vendor/my-local-package后,vendor/vendor/my-local-package将是真实符号链接(Linux/macOS)或 junction(Windows) - 如果本地包用的是 Git 主分支但没打 tag,优先用
"dev-main";若用master,则写"dev-master"
Windows 下 junction 替代 symlink,但 composer dump-autoload 仍需手动运行
Windows 默认不启用开发者模式时,Composer 无法创建原生 symlink,会退化为 junction。这本身不影响代码加载,但有两个关键副作用:
- 修改本地包中的类文件后,项目里不会自动感知变更——因为 Composer 的 autoloader 缓存(
vendor/composer/autoload_classmap.php等)没更新 - 必须在项目根目录手动执行
composer dump-autoload,否则新类/方法不可见 - 若本地包启用了 PSR-4 自动加载,确保其
composer.json中autoload配置路径正确,且与实际目录结构匹配,否则即使链接成功也会报Class not found
多个本地包共存时,repositories 顺序和包名唯一性是硬约束
repositories 是从上到下匹配的,一旦某个包名被前面的仓库命中,后面的同名配置会被忽略。这意味着:
- 所有本地
path仓库必须放在repositories数组最前面,避免被 packagist.org 默认源抢先解析 - 本地包的
name值不能与线上已存在包重名,否则 Composer 会混淆来源,甚至静默失败 - 不同本地包之间不要共用同一
url路径,否则composer update可能复用缓存导致链接指向错误目标 - 如果临时想停用某个本地链接,注释掉对应
repositories条目后,务必运行composer update vendor/name --with-dependencies,否则旧 symlink 仍残留
软链接不是“设一次就一劳永逸”的功能,它的行为高度依赖版本字符串语义、平台权限和配置顺序——任何一项偏差都会让链接变成死链或静默失效。


















