绝对不能删vendor/autoload.php、autoload_classmap.php、public/入口文件、config/src/routes等核心目录;可安全删.git/tests/docs/examples/.github/changelog.md/vendor/bin,但须用--prefer-dist--remove-vcs和archive.excludes配合实现精准剔除。

frankenphp 打包前删目录不是“能删就删”,而是必须避开运行时依赖、又精准剔除纯冗余内容。删错一个 tests/ 或 .git 可能导致类加载失败或构建中断,尤其在 Symfony/Laravel 项目里。
哪些目录绝对不能动
以下路径一旦被删,frankenphp 启动时大概率报 Class not found 或 Failed to open stream:
-
vendor/autoload.php—— autoloader 入口,删了整个应用起不来 -
vendor/composer/autoload_classmap.php(启用--classmap-authoritative后)—— 这是类映射唯一来源 -
public/下的入口文件(如index.php)和静态资源路径 ——frankenphp默认从这里 serve -
config/、src/、routes/等框架核心结构目录 —— 不是体积大户,但删了直接功能缺失
可安全删除的目录(按优先级排序)
这些目录不参与运行时加载,且多数包作者已将其打包进 dist zip,但仍有残留风险。**必须用 composer install --no-dev --prefer-dist --remove-vcs 重建 vendor 后再确认是否还存在**:
-
.git/(根目录和 vendor 内所有子目录)—— 占体积 15%~25%,--remove-vcs能兜底清除 -
tests/、Tests/、test/—— 但注意:某些包(如monolog/monolog)把StreamHandler示例放在tests/下,手动rm -rf tests/会炸 -
docs/、examples/、.github/、CHANGELOG.md——composer-archive-excludes插件配合"config.archive.excludes": ["/tests/", "/docs/"]才真正安全 -
vendor/bin/—— 里面全是软链接或小包装脚本,删了不省多少空间,但可删(前提是没用到phpunit或laravel命令行工具)
为什么不用 find + rm 手动删 vendor 里的 tests
因为这不是“删文件”,而是“破坏包完整性”。几个典型坑点:
-
symfony/console的tests/Command/下有SignalListenerTest类,虽是测试,但部分旧版命令行逻辑会反射调用它 -
laravel/framework的tests/Support/里混着ArrTest的辅助函数,某些第三方包会 require_once 它 -
phpunit/phpunit自身的tests/被删后,phpunit二进制仍存在,但执行时 panic 报错,干扰 CI 日志解析
真正可控的方式只有一种:让 Composer 在解压那一刻就跳过它们 —— 用 composer-archive-excludes + 正确的 /tests/(带前导斜杠)路径写法。
打包前最后一步检查清单
执行完 composer install --no-dev --optimize-autoloader --classmap-authoritative 后,跑这个检查:
- 确认
vendor/composer/autoload_classmap.php里没有tests\或Docs\开头的类路径 - 运行
php -d opcache.enable=0 -d zend_extension=opcache.so -l public/index.php验证语法无误(避免删掉某个关键require) - 用
du -sh vendor/* | sort -hr | head -5查看最大几个包,对异常大的(比如 >10MB)单独 inspect 是否含docs/或未清理的.git/
最易被忽略的是:composer.lock 文件本身没瘦身效果,但它决定了你删哪些、删多少 —— 如果 lock 里记录的是 git source 而非 dist,--prefer-dist 就无效,后面所有操作都白搭。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











