必须用--prefer-source安装,因为提pr需基于git仓库协作:--prefer-dist仅解压代码无.git目录,无法git操作;--prefer-source执行git clone,保留完整工作区和历史,支持checkout、commit、push等全流程。

想为 Composer 包提 PR,必须用 --prefer-source 安装,否则 vendor 目录里没有 .git,根本没法 commit、push 或 git diff。
为什么 --prefer-source 是贡献代码的前提
Contributing 本质是改别人的 Git 仓库,不是改一堆解压后的 PHP 文件。Composer 默认用 --prefer-dist 下载 zip 包,vendor/foo/bar 里只有代码,没有 .git 目录,你连 git status 都跑不了,更别说切分支、写测试、推 PR。
加 --prefer-source 后,Composer 会执行 git clone,完整保留工作区和历史 —— 这是你 fork → clone → 修改 → push 的起点。
- 没
.git:只能看代码,不能参与 Git 协作流程 - 有
.git:能git checkout -b fix/xxx、git add -f vendor/foo/bar(如果项目允许)、git push到自己 fork - 注意:
composer show foo/bar -f=source输出为空,或ls -A vendor/foo/bar | grep git没结果,说明没走 source,得查包是否声明了"source"字段
composer require 加 --prefer-source 最快上手
刚 fork 一个包,想立刻调试+改代码?别删整个 vendor,直接:
composer require vendor/package:dev-main --prefer-source
这条命令会:
- 拉取
dev-main分支(不是stabletag),方便你基于最新开发态改 - 强制克隆 Git 仓库,不是下载 zip
- 自动写进
composer.json和composer.lock,下次composer install仍保持 source 模式
常见坑:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 包作者没填
"source"字段(只写了"dist")→--prefer-source被静默忽略,vendor里还是没.git - 你 fork 后改了 GitHub URL,但没在
repositories里声明 → Composer 还是去原作者地址 clone,失败后 fallback 到 dist - 本地没配 SSH key,而包用的是
git@github.com:...地址 → 克隆卡住或失败
改完代码后怎么提交到自己的 fork
进 vendor/vendorname/packagename 目录,确认远程地址是你自己的 fork:
git remote -v
如果不是,立刻换掉:
git remote set-url origin https://github.com/yourname/packagename.git
然后常规操作:
git checkout -b fix/typo-in-readme- 改文件
git add . && git commit -m "fix: typo in README.md"git push origin fix/typo-in-readme
关键点:
- 别漏掉
git add -f(如果文件被.gitignore拦了,比如某些 IDE 配置) - 别直接
git commit在main分支上 —— PR 必须基于 feature 分支 - 改完别急着
composer update,它会重置你的修改;要提 PR 就先 push,再开 PR 页面
长期维护本地 patch 的替代方案
如果你频繁改某个包,每次 composer update 都冲掉修改,--prefer-source 就不够用了。这时候该换方式:
- 在
composer.json里加自定义repositories,指向你本地的修改版目录:"repositories": [ { "type": "path", "url": "./local/monolog" } ]然后composer require monolog/monolog:dev-master就会软链接过去 - 或者用
composer config repositories.xxx vcs https://github.com/yourname/package.git,让 Composer 从你 fork 的地址拉
这些方法绕过了 vendor 的“临时性”,把修改变成可复现、可 CI 验证的正式依赖。而 --prefer-source 只解决“第一次怎么进去”的问题 —— 它不保存你的改动,也不阻止下次更新覆盖你。










