Composer 管理依赖、box 打包 PHAR 是 PHP CLI 工具主流发布方式;需确保入口可执行、自动加载完整、stub 合规、推荐签名;先初始化项目并配置 composer.json,设 "type": "project" 与 bin 入口,再编写带 shebang 的可执行入口脚本。

用 Composer 管理依赖、用 box 打包成单文件 PHAR,是发布 PHP 命令行工具最主流的方式。关键在于:入口文件要可执行、自动加载要完整、stub 要合规、签名可选但推荐。
1. 初始化项目并配置 Composer
新建项目目录,运行 composer init 或手动创建 composer.json。确保设置 "type": "project",并声明命令入口(如 bin/myapp):
{
"name": "myorg/myapp",
"type": "project",
"autoload": {
"psr-4": {
"MyApp\\": "src/"
}
},
"bin": ["bin/myapp"],
"require": {
"php": "^8.1"
}
}
在 bin/myapp 中写入口脚本(注意首行 shebang 和权限):
#!/usr/bin/env php run();
运行 composer install 安装依赖,并确认 bin/myapp 可执行:chmod +x bin/myapp。
2. 安装并配置 Box
推荐全局安装 Box(v4+ 支持 PHP 8.x):
composer global require humbug/box
在项目根目录创建 box.json,最小可用配置如下:
{
"alias": "myapp.phar",
"main": "bin/myapp",
"output": "build/myapp.phar",
"chmod": "0755",
"compression": "GZ",
"directories": ["src", "bin"],
"files": ["composer.json", "composer.lock"],
"autoloader": "vendor/autoload.php",
"stub": true,
"signing": {
"key": "openssl://path/to/private.key",
"key-pass": "your-passphrase"
}
}
- main 必须指向可执行入口文件(不是 .php 后缀的纯脚本)
- autoloader 指向 Composer 生成的自动加载器,确保所有类能加载
- stub: true 让 Box 自动生成合法 PHAR stub(含 #!/usr/bin/env php)
- 签名非必须,但发布时建议启用,防止篡改
3. 构建 PHAR 并验证
执行打包命令:
box compile
成功后会在 build/myapp.phar 生成文件。验证步骤:
- 检查是否可执行:
php build/myapp.phar --version - 查看内容:
php -d phar.readonly=0 -r '$p = new Phar("build/myapp.phar"); echo $p->getStub();' - 校验签名(如有):
php build/myapp.phar --signature - 测试无 vendor 环境:
rm -rf vendor && php build/myapp.phar
4. 发布与使用
用户只需下载 PHAR 文件,赋予执行权限即可运行:
curl -OL https://example.com/myapp.phar chmod +x myapp.phar ./myapp.phar list
也可通过 sudo mv myapp.phar /usr/local/bin/myapp 全局安装,之后直接输入 myapp 调用。
不复杂但容易忽略:PHAR 内部路径是相对的,所有文件读取(如配置、模板)需用 __DIR__ 或 Phar::running() 动态定位,不能硬编码 ./config.yml。










