在 box.json 的 composer 段落中设 "install": false,再手动执行 composer install --no-dev --optimize-autoloader,并确保 autoload-dev 不被加载、autoload_dev.php 被删除。

box.json 里怎么写才能跳过 dev-dependencies?
Box 默认会把 composer install 的全部依赖打进 PHAR,包括 require-dev 里的东西——这会导致 PHAR 体积膨胀、暴露测试工具、甚至引入不兼容的扩展依赖。关键不是“能不能排除”,而是必须显式告诉 Box:别碰 dev 那部分。
在 box.json 的 composer 段落里加 "install": false,再手动控制依赖安装流程:
-
"install": false—— 关闭 Box 自动执行composer install - 改用脚本先运行
composer install --no-dev --optimize-autoloader - 确保
autoload和autoload-dev在composer.json中分离清晰(PHAR 只需要autoload)
为什么不能只靠 composer.json 的 --no-dev?
Box 内部调用 Composer 时,若没禁用自动安装(即 "install": true),它默认不传 --no-dev,哪怕你本地命令行这么写了也没用。Box 的行为由配置驱动,不是环境继承。
常见错误现象:box compile 后 PHAR 里仍出现 phpunit、mockery 或 symfony/var-dumper —— 这说明 Box 仍加载了 autoload-dev 映射,或 autoloader 生成时混入了 dev 类。
- 检查生成的 PHAR 是否含
vendor/composer/autoload_dev.php:有就是没清干净 -
composer dump-autoload --no-dev必须在box compile前执行,且box.json中"install"设为false - Box v4+ 对
composer.json的autoload-dev字段更敏感,不清理会直接报错
vendor-bin 和 bin-dir 工具怎么处理?
如果项目用 vendor-bin(比如用 humbug/box 自身打包),或者 bin-dir 下有开发专用脚本(如 phpstan、psalm),它们可能被 Box 错误识别为“要打包的二进制文件”。
- 在
box.json中显式设置"binary": false,避免 Box 扫描bin/目录 - 用
"files"白名单精确指定哪些 PHP 文件进 PHAR(例如只列src/和bin/my-app) - 别依赖
"finder"自动包含整个vendor/:它不区分 dev/non-dev,容易漏掉过滤
PHAR 加载时 Class not found 是 autoload 没切干净
打包成功但运行时报 Class 'PHPUnit\Framework\TestCase' not found 或类似错误,往往不是类没打进 PHAR,而是 autoloader 把 dev 类路径也注册了,但实际文件又被剔除,导致映射失效。
根本解法是让 PHAR 内部只用生产级 autoloader:
- 打包前删掉
vendor/composer/autoload_dev.php和autoload_files.php(如果存在) - 用
composer dump-autoload --classmap-authoritative --no-dev --optimize-autoloader - 确认
box.json中"autoloader": "vendor/autoload.php"指向的是清理后的文件
这个环节最容易被跳过:以为 --no-dev 就万事大吉,其实 autoloader 文件本身也要人工干预才可靠。










