composer install 严格依据 composer.lock 安装本地 path 包,首次引入必须先运行 composer update 将路径、分支等信息写入 lock 文件,否则仍安装远程包;path 包不支持语义化版本约束,仅匹配分支名或 commit hash;默认创建 symlink,但受系统和环境限制。

composer install 会严格按 composer.lock 安装本地路径库,但前提是 lock 文件里记录的包来源、版本和路径都已正确生成——它不重新解析 repositories,也不校验本地目录是否存在或是否可读。
本地 path 包必须先被 composer update 记录进 lock 文件
你改了 composer.json 的 repositories 加了 "type": "path",又在 require 里写了 "myvendor/mypackage": "dev-main",但这只是“声明”,不会自动生效。执行 composer install 前,必须至少运行一次 composer update myvendor/mypackage(或全量 composer update),让 Composer 把该包的物理路径、当前 commit hash、分支名等信息写入 composer.lock。
常见错误现象:composer install 完全忽略你的本地包,仍去 Packagist 下载远程同名包——本质是 lock 文件里压根没这条记录,Composer 只认 lock,不看 require。
- 首次引入本地包,必须用
composer update,不是install -
composer update会检查本地路径是否可访问、composer.json是否合法、name是否匹配,失败则中断,不会写入 lock - 一旦写入 lock,后续
composer install就只照单抓取,不再验证路径有效性——哪怕你删了本地包目录,install 仍“成功”,但 vendor 里只剩空文件夹或损坏链接
path 类型仓库下的版本约束实际无效
你在 require 里写 "myvendor/mypackage": "dev-main",这行得通;但写 "myvendor/mypackage": "^1.0" 或 "dev-master"(而本地只有 main 分支)就会失败——Composer 对 path 源不解析语义化版本,只认分支名或 commit hash。
原因:path 源包没有 Packagist 的版本索引,Composer 直接读取本地 Git HEAD 所在分支(或通过 composer.json 的 version 字段 fallback),然后硬匹配你 require 中写的字符串。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 本地包没打 tag,就老老实实用
dev-main(或dev-develop),别指望^1.0自动映射 - 如果本地包
composer.json里写了"version": "dev-main",那require也必须写"dev-main",大小写敏感 -
composer update时若提示Could not find package myvendor/mypackage at version dev-main,八成是本地目录下没 git repo,或 HEAD 不在 main 分支,或composer.json缺name
符号链接行为取决于操作系统和 Composer 版本
Composer 对 path 类型包默认创建符号链接(symlink),而非复制文件。这意味着:vendor 里的包只是指向你本地源目录的快捷方式,改源码立刻生效,无需重复 install。
但 symlink 不是无条件可用:
- Windows 默认禁用 symlink,除非以管理员身份运行 cmd/PowerShell,或启用 Developer Mode;否则 Composer 回退为硬拷贝,失去热更新能力
- 某些 CI 环境(如 Docker 容器)挂载的 host 路径可能不支持 symlink,需显式配置
"options": {"symlink": false}在 repositories 项里 - 如果你手动删过
vendor/myvendor/mypackage,再跑composer install不会自动重建 symlink——必须删整个vendor目录,或运行composer update myvendor/mypackage --no-install再install
vendor-dir 改变后,path 包的链接目标路径不变
你配了 "config": {"vendor-dir": "third-party"},composer install 会把所有包(包括 path 包)装进 third-party/,但 symlink 的目标仍是原始本地路径(比如 ../my-local-package)——这个路径是写死在 lock 文件里的,跟 vendor-dir 无关。
所以只要本地路径没动,链接就有效;但要注意:
- 如果本地包路径用了相对路径(如
"../pkg"),而项目根目录位置变了(比如从/a/project移到/b/project),symlink 就会失效 - 绝对路径更稳定,但会降低项目可移植性;CI 脚本中若用
composer install -d /tmp/build,要确保本地包路径在该上下文中依然可访问 -
composer dump-autoload不影响 symlink 结构,但若你改了本地包的 PSR-4 命名空间,必须运行composer update触发 lock 更新,再install才能刷新 autoload
真正容易被忽略的点:path 包的生命周期完全绑定在 composer.lock 里那一行记录上。它不像远程包可以随时换源或降级——一旦 lock 文件里记的是 dev-main,你就得保证那个分支一直存在、且内容可控;删了分支或重写了 history,composer install 就会卡住,连报错都未必清晰。










