应使用 post-autoload-dump 钩子而非 post-install-cmd 进行 vendor 清理,因其在 autoload.php 生成完毕、类映射就绪后执行,可安全操作依赖文件;误用 post-install-cmd 会导致 autoload 失败或后续命令报错。

Composer 安装后自动清理,不能靠 post-install-cmd 直接删 vendor —— 它在安装完成前就已执行,此时 vendor 还没完全就绪,强行清理会破坏依赖结构。
为什么 post-install-cmd 不适合做“真正完成后的清理”
这个脚本钩子实际在 install 流程的末尾、但仍在 autoload 生成和符号链接建立之前触发。常见误操作是写个 rm -rf vendor/composer/ 或清缓存,结果导致后续 autoload 失败、composer dump-autoload 报错,甚至下次 composer update 拒绝运行。
-
post-install-cmd和post-update-cmd是同一类钩子,行为一致,别指望后者更“晚” - 它不等同于“所有文件已落盘且可安全操作”,尤其对插件或自定义 installer 来说,时机更不可控
- 如果你的清理逻辑依赖
vendor/autoload.php(比如用 PHP 脚本扫描包体积),这时它根本还没生成
真正可靠的方案:用 post-autoload-dump
这个钩子在 autoload.php 写入磁盘、类映射全部就绪后才执行,是 Composer 生命周期里最接近“安装彻底完成”的节点。适合做路径清理、生成统计、校验签名等需完整环境的操作。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
在 composer.json 中添加:
{
"scripts": {
"post-autoload-dump": [
"rm -rf vendor/bin/.phpunit",
"find vendor/ -name '.git' -type d -exec rm -rf {} + 2>/dev/null || true",
"php scripts/clean-vendor-sizes.php"
]
}
}
- 命令按数组顺序执行,任一失败默认中断(加
|| true可忽略非关键错误) - 避免用
rm -rf vendor/*这类宽泛操作 ——vendor/autoload.php和vendor/composer/是必需的,删了就废了 - 如果清理逻辑复杂,务必封装成独立 PHP 脚本(如
scripts/clean-vendor-sizes.php),便于调试和复用
清理什么?优先级和风险提示
不是所有内容都该删。盲目清理可能影响开发体验或 CI 行为:
-
可安全清理:
.git目录(仅限本地开发)、.DS_Store、tests/和docs/(除非你主动 require-dev 里的测试工具) -
谨慎清理:
vendor/bin/下的二进制(如phpunit、phpcs)—— 如果项目用bin-dir自定义路径,删了要重 link -
绝对不要碰:
vendor/autoload.php、vendor/composer/autoload_*.php、vendor/composer/installed.json—— 这些是 Composer 运行时核心 - CI 环境中慎用
find ... -exec rm,某些基础镜像(如php:alpine)缺find,得改用sh -c 'for d in vendor/*/; do [ -d \"$d/.git\" ] && rm -rf \"$d/.git\"; done'
真正卡点在于时机判断:没有“安装完成”的绝对信号,post-autoload-dump 是最稳的锚点;但如果你的清理逻辑需要访问某个包的 composer.json 或执行其 bin 文件,就得确认那个包是否已在 autoload 中注册 —— 否则仍可能失败。










