Box 打包 Composer 项目为 PHAR 需切断与 composer install 的隐式耦合并确保 autoloader 自包含:入口脚本须含 shebang 和显式 require autoload.php;box.json 中设 "install": false,打包前手动执行 composer install --no-dev --optimize-autoloader;文本资源用 directories/files + GZ 压缩,二进制文件用 files-bin/directories-bin;必须配置 "chmod": "0755" 和 OpenSSL 签名。

Box 能把 Composer 项目打包成单文件 PHAR,但直接 box compile 很容易打出体积臃肿、运行报错、甚至无法执行的文件——核心问题不在 Box 本身,而在于你有没有切断它和 composer install 的隐式耦合,以及是否让 autoloader 在 PHAR 内部真正“自包含”。
入口脚本必须带 shebang 且显式 require autoload.php
Box 不会帮你补 #!/usr/bin/env php 或自动加载逻辑,它只按 main 字段指定的路径原样打包并设为 PHAR stub 入口。如果 bin/myapp 没有首行 shebang,或没写 require __DIR__.'/../vendor/autoload.php';,生成的 PHAR 运行时就会报 Class not found 或直接解析失败。
-
bin/myapp文件开头必须是#!/usr/bin/env php(注意换行,不能紧贴 PHP 标签) - 必须手动
require到 Composer 自动生成的 autoload 文件,例如require __DIR__.'/../vendor/autoload.php'; - 该脚本在开发时要能独立运行(
php bin/myapp --version成功),否则打进 PHAR 后也一样失败 - Linux/macOS 下记得
chmod +x bin/myapp,Box 的stub: true依赖这个可执行位来生成合法 stub
box.json 必须关闭自动 install 并预优化 autoload
Box 默认会在打包前静默执行 composer install,这会导致 dev 依赖被一并装入、autoload.php 未优化、甚至因本地环境差异引入不兼容扩展。正确做法是彻底禁用它的自动安装行为,改由你控制。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 在
box.json中设置"install": false(不是"composer-install": false,后者无效) - 打包前手动运行:
composer install --no-dev --optimize-autoloader --classmap-authoritative -
autoloader字段必须指向优化后的路径,通常是"autoloader": "vendor/autoload.php" - 确认
composer.json中autoload和autoload-dev分离清晰,PHAR 只依赖前者声明的命名空间
压缩与二进制文件处理要区分对待
PHAR 支持对 PHP 源码压缩(减体积),但对图片、配置、证书等二进制内容强行压缩反而可能损坏或导致运行时解包失败。Box 提供了明确的字段隔离机制。
- PHP 类、配置、模板等文本类资源走
directories和files,配合"compression": "GZ"安全有效 - 图片、字体、SSL 证书、.env 文件等二进制内容,必须改用
files-bin和directories-bin声明 - 若用了
compactors(如Php或Json),确保它们不误触二进制文件——files-bin下的文件默认跳过所有 compactors -
zlib扩展必须启用,否则GZ压缩的 PHAR 在目标机器上会抛出PharException: unable to open phar
签名和权限设置容易被忽略但影响分发
没签名的 PHAR 可被任意篡改,没设对权限则 Linux/macOS 下无法直接 ./myapp.phar 执行——这两项不是“锦上添花”,而是生产分发的硬性前提。
-
"chmod": "0755"是必须的,否则生成的 PHAR 缺少执行位,php myapp.phar可行,但./myapp.phar报Permission denied - 签名需 OpenSSL 私钥,配置里写
"key": "openssl://path/to/private.key",私钥密码用"key-pass" - 签名后验证命令是:
php myapp.phar --signature,输出应为SHA512或你配置的算法名,而非空或报错 - 别把私钥打进 PHAR;
files或directories列表里绝不能包含私钥路径
最常被跳过的其实是 install: false 和 --no-dev --optimize-autoloader 这组组合——不切断 Box 的自动安装,就永远不知道 PHAR 里到底塞进了多少测试工具和无用类;不预优化 autoload,PHAR 启动就会慢一倍以上,还可能因 classmap 冲突失败。

















