Composer install找不到本地包的根本原因是repositories未配置或不合法:必须在项目根composer.json根级声明type为"path"的仓库,url指向含合法composer.json的目录(不可带末尾/),且本地包name须与require中逐字一致,还需Git commit;符号链接由本地包自身composer.json中"options": {"symlink": true}控制,修改代码后需运行composer update vendor/name刷新。

Composer 依赖注入本地源码,不是“装进去”,而是“指过去”——必须通过 repositories 声明 path 类型仓库,否则 require 字段写什么都无效。
为什么 composer install 找不到本地包?
根本原因不是路径错、不是没写 require,而是 repositories 没配或配得不合法:
-
repositories必须写在项目根目录的composer.json根级(不能塞进require或config) -
"type": "path"的url必须指向一个**含合法composer.json的目录**,不是文件,也不能以/结尾(如"../pkg/"会静默失效) - 本地包的
composer.json中name字段必须和require里写的**逐字一致**:大小写、短横线-、vendor 名全部对齐("acme/utils"≠"Acme/utils") - 本地包目录下必须有 Git commit(哪怕只是
git init && git add . && git commit -m "init"),否则 Composer 拒绝加载
怎么让 vendor/ 里是符号链接而不是复制?
默认行为取决于系统和配置,但主动控制靠的是**本地包自己的 composer.json**,不是主项目的:
- 在本地包的
composer.json里加:"options": {"symlink": true} - Linux/macOS 通常默认生效;Windows 需管理员权限运行终端,否则静默 fallback 到复制
- Docker 场景需加
--cap-add=SYS_ADMIN,且挂载方式要支持 symlink - 验证是否成功:
ls -la vendor/vendor/name(Linux/macOS)看到->,或dir vendor\vendor\name(Windows)看到JUNCTION或<SYMLINKD>
改了本地代码,为什么项目里不生效?
因为 composer install 不刷新已有链接,只补缺。它读的是 composer.lock 记录的旧解析结果:
- 本地包代码改完后,必须运行:
composer update vendor/name - 不要用无参数的
composer update,避免意外升级其他依赖 - 如果用了通配符路径(如
"../packages/*"),每个子目录都得有独立composer.json,且name各自匹配 - autoload 不更新?那是另一回事:
composer dump-autoload -o才刷新类映射,和 symlink 无关
生产环境部署前最该检查的一件事
CI/CD 流程里,repositories 中的 path 条目必须被移除或跳过——服务器上不存在那个路径,Composer 不会自动 fallback 到 Packagist,而是直接报错退出。
最容易被忽略的是:你本地测试时一切正常,但上线构建失败,只因 composer.json 里还留着那行 "url": "../my-pkg"。别指望它“聪明”,它只认路径,不猜意图。


















