composer本身不支持发布补丁,只能通过fork目标包、在fork中提交修复并打带v前缀的规范tag(如v2.10.0-patch1)、配置vcs仓库并在项目中require该分支别名,才能让下游稳定复用修复。

补丁不能“发布”,只能“提供新版本”
Composer 本身不支持“发布补丁”这个动作。你看到的 extra.patches 配置只在当前项目生效,不会进 composer.lock,更不会上传到 Packagist。下游用户 clone 你的项目、删掉 vendor 后运行 composer install,若没装 cweagans/composer-patches 插件,补丁直接被忽略;就算装了,路径错一个字符、换行符是 CRLF、插件版本不一致,都会导致失败。
真正能让团队或下游稳定复用修复的方式,只有一种:fork + vcs + tag。
- fork 目标包(如
monolog/monolog→yourname/monolog) - 在 fork 中建分支(如
fix-null-dereference),提交修复并 push - 在你自己项目的
composer.json顶层加repositories:
"repositories": [
{
"type": "vcs",
"url": "https://github.com/yourname/monolog"
}
]
- 把原
require改成指向该分支别名:"monolog/monolog": "dev-fix-null-dereference as 2.10.0" - 删掉
vendor和composer.lock,再composer install
为什么打 tag 而不是写 patch 文件?
Git tag 是唯一被 Packagist 识别的版本信号。它不看 composer.json 里的 version 字段,只认 tag 名。格式必须是 v1.0.0(带小写 v 前缀、无后缀、无空格)。打错 tag 格式(比如 1.0.0 或 V1.0.0),Packagist 就当它不存在,下游执行 composer require vendor/name:^1.0 会报 Could not find package。
正确命令是:
git tag -a v2.10.0-patch1 -m "fix null dereference in Logger::log"
然后必须显式推送:
git push origin v2.10.0-patch1
别用 git push --tags,它可能漏推某个 tag。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
post-update-cmd 里不能直接跑 git pull
在 scripts 里写 "post-update-cmd": ["git pull origin main"] 看似省事,但极不稳定:当前工作目录虽是项目根目录,但 $_SERVER['HOME'] 可能指向 root 或 www-data,ssh 密钥、git config --global user.name 往往缺失,权限和环境变量全不可控。
可靠做法是:
- 用绝对路径指定部署目标,比如
/var/www/myapp/current,别用../prod - 所有外部命令显式指定用户上下文:
sudo -u www-data bash deploy.sh - 禁用 credential helper,改用 deploy key:
git -c core.sshCommand="ssh -i /path/to/key" pull
CI 中跑 release 脚本要绕过交互
本地测试时 readline 提问很自然,但在 CI 中会卡住。所有需要输入的环节(比如确认版本号、输入 commit message)必须提前通过环境变量传入,或加 --no-interaction 参数。
例如,release 脚本里如果有:
php ./bin/release.php --version=2.10.0-patch1
就比 php ./bin/release.php 然后等 stdin 输入安全得多。否则 CI 流水线会超时失败,且无明确错误提示。
最易被忽略的一点:tag 对应的 commit 必须已包含合法 composer.json,否则 Packagist 抓取时校验失败,整个发布流程就断在第一步——连 webhook 触发机会都没有。










