因为composer install只按composer.lock安装,不解析repositories配置;必须删lock后运行composer update或直接composer require才能加载新本地包。

为什么 composer install 不加载本地软链接包的代码?
因为 Composer 默认只处理 vendor/ 下的真实依赖,对通过 ln -s 或 Windows 符号链接手动挂进 vendor/ 的包,不会解析其 autoload 配置,也不会写入 vendor/composer/autoload_psr4.php。你改了源码,require 还是报 Class not found,不是路径问题,是根本没注册进自动加载映射。
用 path 仓库类型替代软链接
这是最稳、官方支持的方式:告诉 Composer “这个包不在 Packagist,它就在本机某路径下”,它会像处理真实包一样读取 composer.json 中的 autoload 字段,并生成对应加载规则。
操作步骤:
- 在项目根目录的
composer.json中添加repositories块,类型设为path,指向你的本地包目录(支持 glob,如../my-packages/*) -
require该包时,版本必须写dev-main(或dev-master)、dev-develop等开发分支别名,不能写1.0.0 - 运行
composer update vendor/name(不要全量 update,避免意外升级其他包)
示例配置:
{
"repositories": [
{
"type": "path",
"url": "../my-utils"
}
],
"require": {
"acme/my-utils": "dev-main"
}
}
path 仓库下修改代码为何有时不生效?
因为 Composer 会把 path 包的内容硬链接(Linux/macOS)或复制(Windows)到 vendor/,默认开启 symlink 优化,但仅限于首次安装;后续 composer update 可能跳过同步,尤其当包内 composer.json 的 version 字段没变时。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
确保实时生效的关键点:
- 删掉
vendor/acme/my-utils目录再composer update - 或者在
repositories.path配置里显式加"options": {"symlink": true}(Composer 2.2+) - 检查你的包自身
composer.json是否正确定义了autoload.psr-4,例如:"autoload": {"psr-4": {"Acme\Utils\": "src/"}}
能不能直接改 vendor/composer/autoload_*.php 手动加映射?
能,但不推荐。这些文件是 Composer 自动生成的,下次 composer dump-autoload 或任何依赖变更都会被覆盖。唯一可持久的手动干预点是项目级 autoload —— 在你主项目的 composer.json 里加:
"autoload": {
"psr-4": {
"Acme\Utils\": "../my-utils/src/"
}
}
然后运行 composer dump-autoload。这种方式绕过了包管理,适合临时调试,但会丢失包自身的版本约束和依赖声明,多人协作时容易不同步。
真正需要长期协同开发的包,就该走 path 仓库 + dev-xxx 版本这一条路。别省那几秒去 ln -s,后面花十分钟排查 autoload 失效更不划算。

















