本地包版本装错是因为未配置path类型仓库,必须在repositories中声明type为path、url为相对路径,并在require中用"*",否则Composer仍从远程拉取旧版本。

为什么 composer install 总是装错本地包版本?
因为 Composer 默认按 composer.json 中的 require 版本约束拉取远程包,即使你本地改了代码、跑了 composer link,只要没显式告诉它“用这个路径”,它就无视你的本地修改。常见现象是:改完本地包,composer update my/package 后还是旧逻辑,var_dump 也看不到新代码——本质是 autoloader 指向了 vendor 里的旧副本,不是你正在编辑的目录。
用 path 仓库类型强制走本地文件系统
在项目根目录的 composer.json 里加一个 repositories 块,把本地包路径声明为 path 类型仓库,优先级高于 Packagist:
{
"repositories": [
{
"type": "path",
"url": "../my-local-package"
}
],
"require": {
"my/local-package": "*"
}
}
关键点:
-
"*"是必须的——path仓库不支持版本号匹配,只认*或dev-main这类分支别名 - 路径必须是相对当前项目
composer.json的,不能用~/或绝对路径 - 本地包自己的
composer.json里name必须和项目require的完全一致(包括大小写) - 执行
composer update my/local-package后,vendor 里会变成一个符号链接,指向你指定的本地目录
composer link 为什么经常失效?
composer link 是社区脚本(如 hirak/prestissimo 不带这个命令),官方 Composer 从没内置过。很多人误以为它是原生命令,实际是某些第三方插件或自定义 alias,行为不可靠。更麻烦的是:它只影响当前项目,不解决多版本共存问题——比如你同时调试 v1.2 和 v2.0 两个本地分支,link 没法指定分支,也没法并存。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
真正可控的做法是:给不同版本建不同本地目录,比如 ../my-package-v1 和 ../my-package-v2,然后在对应项目中分别配置 path 仓库。需要切版本?改 url 路径 + composer update 即可。
怎么确认当前加载的是本地代码而不是 vendor 缓存?
最直接的办法是查 autoloader 映射:
php -r "include 'vendor/autoload.php'; var_dump(\Composer\Autoload\ClassLoader::getRegisteredLoaders());"
找到你包的命名空间,看对应的路径是不是你期望的本地目录。另一个快速验证方式是故意在本地包里加一行 die('I am local');,如果页面没死,说明根本没加载到它。
容易被忽略的一点:composer dump-autoload -o 生成的优化 autoload 文件会缓存路径,改了 path 仓库后,必须先 composer dump-autoload(不加 -o)再 composer update,否则符号链接可能被绕过。

















