composer 默认按 composer.lock 安装远程包,不识别本地修改;调试需用 path 仓库类型配置本地路径并启用 symlink,使 vendor 中包变为符号链接,实现代码实时生效。

为什么 composer install 总是拉远程包,不认本地修改?
因为 Composer 默认按 composer.lock 中记录的哈希和版本号安装,哪怕你把 vendor/xxx/xxx 里的代码改得面目全非,下次 composer install 或 composer update 仍会覆盖回 lock 文件指定的版本——它根本不管本地改没改。
这不是 bug,是设计使然:lock 文件保障可重现性。但调试本地包时,你需要的是「绕过版本锁定,直连本地源码」。
- 别手动改
composer.json里的"version"字段,Composer 会忽略它(除非加"minimum-stability": "dev"且用dev-master这类分支别名) - 别指望
composer dump-autoload解决——它只刷新自动加载映射,不改变包来源 - 真正起效的是让 Composer 把本地路径当作「源」,而非从 packagist 下载
用 path 仓库类型让 Composer 直接 symlink 本地包
在项目根目录的 composer.json 中添加 repositories 块,指向你的本地包路径:
{
"repositories": [
{
"type": "path",
"url": "../my-local-package"
}
],
"require": {
"acme/my-local-package": "*"
}
}
关键点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
url必须是相对于当前composer.json的路径,支持../、./packages/xxx等写法 -
"*"版本号会让 Composer 自动匹配本地包composer.json中的version(或推断为dev-main),无需硬编码 - 执行
composer update acme/my-local-package后,vendor/acme/my-local-package会变成指向../my-local-package的符号链接,改本地代码立刻生效 - 注意:Windows 上需启用开发者模式或以管理员身份运行终端,否则 symlink 可能失败(报错
failed to create symbolic link)
调试中误删 vendor 或重装后 symlink 消失怎么办?
不是所有环境都默认启用 symlink(尤其某些 CI 或旧版 Composer)。检查 config 是否禁用了它:
- 运行
composer config --list | grep -i symlink,确认config.symlink是true - 如果为
false,执行composer config symlink true(写入当前项目composer.json的config段) - 更稳妥的做法是在项目
composer.json中显式声明:"config": { "symlink": true } - 若仍失败,可临时改用
"type": "package"+"dist"手动指定路径,但会复制而非链接——失去实时调试能力,仅作备用
上线前忘记切回正式包版本的风险
path 仓库只在本地有效,无法被其他人或生产环境复现。上线前必须清理:
- 删掉
repositories块,还原require中的版本号为稳定版(如"^1.2") - 运行
composer update acme/my-local-package,触发重新下载并更新composer.lock - 检查
git status,确保没把path配置误提交——这是最常被忽略的一步,CI 构建会直接失败
真正的难点不在怎么连本地,而在「什么时候断开」——没人提醒你删掉那几行 JSON,它就一直静静躺在那里,直到某次部署报错 Could not find package acme/my-local-package at version *。










