清理弃用代码不能靠 Composer 自动完成,它只管依赖声明层,不管运行时引用;所谓“自动化”本质是将人工验证压缩进可重复脚本链,而非跳过验证,post-autoload-dump 是唯一能安全触发清理的生命周期事件,覆盖 install/update/dump-autoload 全场景且默认不被 --no-scripts 屏蔽。

清理弃用代码不能靠 Composer 自动完成,它只管依赖声明层,不管运行时引用。所谓“自动化”,本质是把人工验证环节压缩进可重复的脚本链里,而不是跳过验证。
post-autoload-dump 是唯一能安全触发清理的生命周期事件
这个事件在 vendor/autoload.php 和所有 autoload 映射文件写完之后才执行,意味着类已可加载、php artisan 或 bin/console 命令能跑通、rm -rf 不会因权限或路径未就位而失败。它覆盖 composer install、composer update、composer dump-autoload 全部场景,且默认不被 --no-scripts 屏蔽(除非显式禁用)。
常见错误是误用 post-install-cmd 或 post-update-cmd:它们在 autoload 文件生成前就触发,Class not found 错误频发;CI 环境中还常因 --no-scripts 默认开启而完全静默失效。
- 必须加
--no-interaction到所有 Laravel/Symfony 命令里,否则 CI 会卡住 - 避免用
&&链式调用,Composer 对 shell 解析不稳定,分开写更稳 - Windows 下
rm -rf失效,改用php -r "array_map('unlink', glob('var/cache/*'));"更跨平台
composer-unused 扫描必须配准路径和排除项才可靠
composer-unused 默认只扫 src/,但 Laravel 项目逻辑在 app/、Symfony 在 src/、旧项目可能在 lib/ 或 classes/ —— 不指定 --scan-path 就等于没扫。它也不排除 vendor/,若项目用了 composer install --prefer-source,扫描结果会被 vendor 里的测试用例污染。
动态调用永远是盲区:class_exists('SomeClass')、Doctrine 注解、配置文件中的字符串类名、服务提供者里 $this->app->register() 的包,它一概不识别。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必加排除:
--exclude vendor --exclude var --exclude storage --exclude bootstrap/cache - 测试代码要扫,就得显式加
--scan-tests或把tests/加进autoload-dev.ps4映射 - PHP 版本必须匹配:PHP 7.4 项目只能用
composer-unused:^0.9.11,新版(v0.12+)强制要求 ≥8.1
批量删除必须用 composer remove pkg1 pkg2 原子操作
composer remove 是原子命令:一次性更新 composer.json、composer.lock、重建 autoload 映射、并触发卸载脚本。失败则全部回退,不会出现“删了一半、autoload 还指着旧路径”的状态。循环调用 composer remove 是反模式,容易中断后残留中间态。
它不会自动清理 vendor 目录物理文件——这是设计,不是 bug。残留本身不危险,但必须补同步步骤。
- 多个包名用空格分隔,不要引号或逗号:
composer remove spatie/laravel-permission laravel/sanctum - 若某包被其他已装包依赖,命令会报错并中止,其余包不会误删
- 删完必须补
composer install:按当前composer.lock重建vendor/,自动剔除未声明且无引用的包
CI/CD 中不能依赖 post-* 事件自动清理
GitHub Actions、GitLab CI 等环境默认不走 Composer 脚本生命周期,靠 post-* 事件纯属碰运气。必须在 workflow 步骤里显式控制顺序:
先 composer clear-cache --no-interaction 清全局缓存;再 rm -rf vendor 彻底删项目级依赖;最后 composer install --no-interaction --prefer-dist --optimize-autoloader 强制走 zip 包安装,避免 git clone 缓存干扰版本一致性。
真正麻烦的从来不是删包本身,而是那些没写在 composer.json 里、却活在 app/ 目录下对旧包的隐式调用——它们不会报错,只会在某个边缘路径里突然抛出 Class not found。

















