直接 composer install 打不出线上包,因其会安装 require-dev 依赖、不优化自动加载、不清理 tests/.git/installed.json 等敏感文件,导致体积大、性能差、攻击面广;必须用 --no-dev --optimize-autoloader --classmap-authoritative --no-interaction 安装后,再手动清理 vendor/bin/、tests/、.git、installed.json 等冗余内容,最后用 tar/zip 打包并确保含 composer.lock。

composer install 本身不是打包命令,它只生成 vendor/ 目录;真要产出可部署包,必须配合参数控制行为、清理冗余、再用系统工具归档。
为什么直接 composer install 打不出线上包
裸跑 composer install 会装 require-dev 里的包(比如 phpunit)、不优化自动加载、留下大量测试/文档/配置文件,导致体积膨胀、攻击面扩大、类加载慢 3–5 倍。更关键的是:它不清理 vendor/bin/、vendor/**/tests/、vendor/composer/installed.json 这些不该上线的东西。
- 没加
--no-dev→phpstan、infection全进生产镜像 - 漏掉
--optimize-autoloader→ 每次请求都扫描 PSR-4 目录,性能崩 - 没加
--classmap-authoritative→ autoloader 仍会 fallback 到文件系统查找,失去 classmap 加速意义 - 没清理
vendor/bin/→phpunit或phpcs二进制可能被 Web 路径遍历执行
composer install --no-dev --optimize-autoloader --classmap-authoritative 是底线
这条命令是生产构建不可跳过的起点,但它只解决“装什么”,不解决“留什么”。必须在它之后立即执行清理动作,否则 vendor/ 仍是危险状态。
-
--no-dev:跳过require-dev,但不会删掉已存在的vendor/{pkg}/tests/ -
--optimize-autoloader:生成vendor/composer/autoload_classmap.php,提速核心依赖加载 -
--classmap-authoritative:让 autoloader 完全信任 classmap,不再尝试 PSR-4 自动发现 - 必须加
--no-interaction:CI/CD 环境无 TTY,不加会卡住
示例完整命令:composer install --no-dev --optimize-autoloader --classmap-authoritative --no-interaction
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
打包前必须手动清理 vendor 中的危险残留
composer install 不负责删东西,所有冗余文件都得你主动剔除。常见遗漏点包括:vendor/bin/、vendor/**/tests/、vendor/**/.git、vendor/composer/installed.json —— 这些不是“可选清理”,是安全硬要求。
-
vendor/bin/全部删除(除非你明确需要phinx或doctrineCLI 在线上运行) - 递归删除
tests/、Tests/、test/、Test/目录(Linux/macOS 可用find vendor -path '*/tests' -o -path '*/.git' -delete) - 删掉
vendor/**/{phpunit.xml,phpstan.neon,psalm.xml,.travis.yml} - 删掉
vendor/composer/installed.json(含全部包版本与哈希,泄露后可辅助漏洞利用)
别信“装完就完事”,清理步骤必须显式写进 CI/CD 脚本或 Dockerfile,不能靠人肉操作。
最终打包要用系统命令,不是 composer archive
composer archive 命令根本不存在,它只是个常见误解。真正可用的是 zip、tar 或 git archive,前提是 vendor/ 已经是干净、可运行的状态。
- 先确保
vendor/是刚用--no-dev --optimize-autoloader生成的,且已完成上述清理 - 再执行
tar -czf myapp-prod.tgz .(当前目录含vendor/和项目代码) - 解压后必须能直接
php index.php启动,否则说明autoload.php没生成或路径不对 - 验证时重点检查:
vendor/autoload.php是否存在、vendor/composer/autoload_classmap.php是否非空、vendor/bin/是否为空
离线部署场景下,这个包还必须包含 composer.lock,否则重建 vendor/ 时版本失控——这是最容易被忽略的隐性依赖。

















