不能软链接共享 vendor 目录,因其会导致 autoload 路径错误、opcache 冲突及插件污染;唯一安全共享的是 composer 缓存目录 ~/.composer/cache;推荐用 type: "path" 仓库配合 symlink 实现源码级复用。

不能软链接共享 vendor 目录,哪怕磁盘告急也不行——这不是省空间的方案,是埋雷的快捷方式。
为什么 vendor 软链接必然失败
vendor/autoload.php 里硬编码了 __DIR__,一旦被软链,所有 require 路径全错乱,Class not found 是最轻的后果;更隐蔽的是 opcache 缓存复用、autoload_static.php 映射冲突、插件(如 hirak/prestissimo)状态互相污染。即使你手动保证 PHP 版本、platform 配置、composer.lock 完全一致,只要某个项目启用了 composer-plugin-api 的不同小版本,整个链路就不可靠。
常见错误现象:
require_once(): Failed opening required 'vendor/autoload.php'- 本地改了 SDK 代码,但项目里始终不生效(其实是 fallback 到了复制模式)
-
composer install后类能加载,但 PHPUnit 报找不到TestCase(全局 autoload 未接入)
真正可共享的只有 Composer 缓存目录
Composer 默认把下载的包压缩包缓存在 ~/.composer/cache,这个路径天然跨项目复用,无需配置。它不影响 vendor 结构,也不破坏 autoload,是唯一安全的“共享”。
实操建议:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 确认所有项目走的是同一缓存路径:运行
composer config --global cache-dir,输出应为/home/username/.composer/cache或等效路径 - 不要手动改
COMPOSER_HOME指向一个被多个用户共用的路径(如/opt/composer-cache),权限错乱会导致cache-dir is not writable - CI 环境中若用 Docker,挂载
~/.composer/cache到镜像内固定路径即可,比每构建一次都重下快 3–5 倍
想省 vendor 空间?用 path 仓库 + symlink,不是共享 vendor
目标不是让多个项目共用一份 vendor 文件,而是让它们各自 vendor 下的包,指向同一份源码——这才是 type: "path" 的正确用途。
关键配置点:
- 在主项目
composer.json的repositories里加:{"type":"path","url":"../shared-utils","options":{"symlink":true}} -
require必须写"myorg/utils": "dev-main"或"*@dev",不能写"^1.0"(path 仓库无版本元数据) - 子包根目录必须有合法
composer.json,其中name字段(如"myorg/utils")大小写、斜杠方向必须与require完全一致 - 执行
composer update myorg/utils,不是install——后者只读 lock,不触发 symlink 创建逻辑
Windows 和容器环境要额外防坑
Windows 默认禁用符号链接,Docker 容器常以非 root 用户运行,这两类环境默认会静默 fallback 到“复制”模式,导致改源码不生效,却没有任何报错。
必须显式处理:
- Windows:启用“开发者模式”,并以管理员身份运行终端;或直接在
repositories中加"options": {"symlink": false},接受复制,但需配合脚本自动同步 - Docker:启动时加
--cap-add=SYS_ADMIN,或改用preferred-install全局设为"source",再跑update - 任何环境首次失败后,先
composer clear-cache,再composer update myorg/utils --no-cache强制刷新元数据
最常被忽略的一点:path 仓库只用于开发联调,上线前必须从 repositories 中移除,并切换到私有 Packagist 或 Git VCS 源——否则部署脚本会因找不到本地路径而中断。










