Composer默认不解压过滤上游包内的.env.example、phpunit.xml等文件,它们随dist zip原样落入vendor;需用composer-archive-excludes插件配合archive.excludes规则在解压时跳过,再执行rm -rf vendor && composer install --no-dev --prefer-dist --remove-vcs --optimize-autoloader --classmap-authoritative实现彻底清理。

为什么部署后 vendor 里还有 .env.example、.gitignore、phpunit.xml?
这些文件不是 Composer 主动生成的,而是上游包作者打包进 dist zip 的“副产品”。Composer 默认不解压过滤,只要包里有,就会原样落到 vendor/{package-name}/ 下。尤其 .env.example 和 phpunit.xml 常见于 Laravel 生态包(如 laravel/framework 或 orchestra/testbench),虽不参与运行,但混在生产环境里属于敏感信息暴露风险。
用 archive.excludes 在解压时直接跳过敏感路径
这是最干净、不可逆的清理方式——文件根本不会落地,避免后续扫描或误删风险。
- 先安装插件:
composer require --dev composer-archive-excludes - 在项目
composer.json的config块中添加:
"archive": {
"excludes": [
"/.env.example",
"/phpunit.xml",
"/phpunit.xml.dist",
"/.gitignore",
"/.editorconfig",
"/.prettierc"
]
}
注意:archive.excludes 只对 --prefer-dist 下载的 zip 包生效;必须配合 rm -rf vendor/ && composer install --no-dev --prefer-dist 才会触发规则。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
别用 find + rm 清理已存在的敏感文件
手动执行 find vendor -name ".env.example" -delete 看似快,但有三个实际坑点:
- 某些包(如
laravel/dusk)的测试启动逻辑会尝试加载phpunit.xml,删了可能让vendor/bin/phpunit报错(即使你不用它) -
.env.example被 IDE 或编辑器自动识别为模板,删完可能触发本地配置重载,干扰开发体验 - 下次
composer update或 CI 重装,只要没配archive.excludes,它们又回来了——等于白清
生产部署脚本里必须加 --remove-vcs 和 --classmap-authoritative
仅靠 archive.excludes 不够,因为部分包 zip 里仍残留 .git 目录,而 .git/config 可能含 token 或私有源地址。
-
--remove-vcs是 Composer 内置参数,在解压后、写入前强制删除所有.git/子目录,比正则更底层 -
--classmap-authoritative必须启用:否则 autoload 仍会遍历整个vendor/,遇到已删的.env.example所在目录可能触发 warning 或 NFS 权限异常 - 推荐部署命令组合:
rm -rf vendor composer.lock && composer install --no-dev --prefer-dist --remove-vcs --optimize-autoloader --classmap-authoritative
真正麻烦的不是文件本身,是它们出现在 vendor/composer/autoload_psr4.php 的映射路径里却已不存在——autoload 不报错,但容器冷启动时 scandir 失败可能卡住进程。

















