正确做法是用 repositories 指向 fork 的 git 仓库并设版本为 dev-分支名;本地调试优先用 path 类型;pr 应基于 upstream/main 新建特性分支,确保测试通过、描述清晰。

怎么让 Composer 加载本地修改的包
直接改 vendor 里的代码,下次 composer install 就被覆盖——这是最常踩的坑。正确做法是用 repositories 指向你 fork 后的 Git 仓库,并把版本约束改成 dev-* 分支名。
比如原包是 monolog/monolog,你 fork 到 yourname/monolog 并在 dev-fix-log-level 分支上改了代码,composer.json 就得这么写:
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/yourname/monolog"
}
],
"require": {
"monolog/monolog": "dev-fix-log-level"
}
}
-
type: "vcs"是必须的,Composer 才会按 Git 仓库解析 URL - 分支名必须带
dev-前缀,否则 Composer 默认只认stable版本(如1.29.0),不拉dev-分支 - 别用
master或main直接当版本号——它会被当作不稳定版本,但可能触发minimum-stability拒绝安装
为什么 composer update 不拉你的新提交
因为 Composer 默认会缓存 Git 仓库的 commit hash,哪怕远程分支已更新,本地 lock 文件仍锁着旧 commit。不是网络问题,也不是权限问题,是缓存机制本身如此。
- 执行
composer update monolog/monolog --with-dependencies强制重解析依赖树 - 或者删掉
composer.lock再composer install(仅限开发环境) - 更稳妥的是在
repositories里加"no-api": true,绕过 Packagist 的元数据缓存,直连 Git 获取最新 refs
path 仓库类型比 vcs 更适合本地调试
如果你只是临时改包、还没 push 到远程,用 path 类型省事又可靠,完全跳过 Git 协议和分支匹配逻辑。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
例如本地把包克隆到 ./packages/monolog,composer.json 改成:
{
"repositories": [
{
"type": "path",
"url": "./packages/monolog"
}
],
"require": {
"monolog/monolog": "*"
}
}
-
url必须是相对路径(从composer.json所在目录算起),不能用~/或绝对路径 -
require中版本写*或dev-master都行,Composer 会自动识别composer.json里的version字段 - 每次改完本地代码,只需
composer update monolog/monolog,无需 commit / push / 等远程同步
改完怎么提交 PR 回原项目
别直接在 fork 仓库的 main 上改——这样没法和上游保持同步,后续 rebase 或 cherry-pick 都会变麻烦。
- 基于上游最新
main新建特性分支,比如git checkout -b fix/log-level-filter upstream/main - 所有修改只在这个分支做,commit 清晰、单职责(比如一个 commit 只修一个 bug)
- PR 标题写明影响范围,描述里贴出复现步骤和预期行为,方便维护者验证
- 如果原项目有 CI,确保本地
composer test或对应命令能过,否则 PR 很可能被拒
真正难的不是 Fork 和改代码,而是让改动能长期合入主干——分支管理松散、测试缺失、描述含糊,都会卡在 PR 这一步。










