vendor里不是符号链接,是因为composer默认静默fallback为复制;需检查路径、权限、name字段一致性、版本匹配及是否显式配置"options":{"symlink":true}。

composer.json 里配对了 path 仓库,但 vendor/vendor/name 不是符号链接?那基本不是配置漏了,就是条件没满足——Linux 下 symlink 失败几乎总是权限、路径或版本对不上导致的。
为什么 vendor 里没出现符号链接?
Composer 在 Linux 下默认尝试创建符号链接,但会静默 fallback 到复制(copy)行为,不报错也不提醒。常见原因有:
-
repositories.url路径写错:比如用绝对路径却漏掉/home/前缀,或相对路径少了一个..;Linux 对路径大小写和斜杠方向敏感,../mypkg/和../mypkg(末尾斜杠)在某些 Composer 版本中解析结果不同 - 本地包
composer.json的name字段与主项目require中的完全不一致(包括大小写),例如主项目写"myorg/mypackage",而本地包里是"MyOrg/MyPackage" - 版本不匹配:
require写"dev-main as 1.0.x-dev",但本地包composer.json里version是"1.0.0"或留空且 Git 分支名不是main;Composer 不会自动把dev-main映射到未声明 version 的本地目录 - 目标目录不可访问:PHP 进程用户(如
www-data或当前 shell 用户)对本地包路径没有读取权限,ls -l ../my-local-package报Permission denied就直接退为 copy
ls -l vendor/vendor/name 显示普通目录,怎么确认是不是 symlink?
别只看文件夹图标或 dir 输出——Linux 下必须用 ls -l 看第一列和箭头:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 成功 symlink:输出类似
lrwxrwxrwx 1 user user 18 Jul 12 10:22 myorg/mypackage -> ../../my-local-package,开头是l,末尾带-> - 失败 fallback:开头是
drwxr-xr-x,后面没箭头,那就是个普通文件夹,内容是复制出来的快照 - 如果看到
broken symlink(红底白字或提示 “No such file or directory”),说明路径存在但指向无效,检查url是否拼错或本地包被移走了
怎样强制 Composer 创建 symlink?
靠默认行为不可靠,尤其在 CI 或 Docker 容器里。显式声明最稳:
- 在主项目
composer.json的repositories里加"options": {"symlink": true},不是放在config顶层 - 同时确保
config段没设"symlink": false,否则会被覆盖 - 运行
composer update vendor/name --no-install先清旧状态,再composer install或composer update vendor/name触发重装 - 若仍失败,临时提权测试:
sudo -u www-data composer update vendor/name(仅用于排查权限问题,生产勿留)
本地包改了代码,主项目没反应?
符号链接本身没问题,但 PHP 自动加载可能缓存旧映射:
- 执行
composer dump-autoload—— 这步不能省,尤其当你改了autoload或autoload-dev规则 - 如果本地包用了
psr-4映射,主项目composer.json的autoload不会自动继承它;调试时建议在主项目也补上对应映射,或直接require本地包的src/目录做临时验证 - Docker 环境下注意:宿主机建的 symlink,在容器内挂载后可能失效,除非你用
bind mount把整个本地包目录原样挂进容器,而不是只挂vendor
ls -l 看链接是否存在,再查权限和版本对齐,最后碰 autoload 缓存——顺序错了,容易在错误的地方反复折腾。










