如何使用Composer和box-project来打包一个PHAR命令行应用?(完整教程)
发布时间 - 2025-12-25 00:00:00 点击率:次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。
# php
# js
# json
# composer
# app
# 工具
# echo
# 可执行
# 自动加载
# 如有
# 只需
# 会在
# 也可
# 可选
# 关键在于
# 命令行
# 自动生成
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
微信小程序 input输入框控件详解及实例(多种示例)
如何在万网利用已有域名快速建站?
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
如何确保西部建站助手FTP传输的安全性?
Java遍历集合的三种方式
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
Bootstrap整体框架之CSS12栅格系统
bootstrap日历插件datetimepicker使用方法
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
香港服务器租用费用高吗?如何避免常见误区?
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
Laravel如何使用withoutEvents方法临时禁用模型事件
轻松掌握MySQL函数中的last_insert_id()
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
Python正则表达式进阶教程_复杂匹配与分组替换解析
Android实现代码画虚线边框背景效果
如何快速生成凡客建站的专业级图册?
用v-html解决Vue.js渲染中html标签不被解析的问题
Android滚轮选择时间控件使用详解
如何在七牛云存储上搭建网站并设置自定义域名?
网站制作价目表怎么做,珍爱网婚介费用多少?
油猴 教程,油猴搜脚本为什么会网页无法显示?
如何用免费手机建站系统零基础打造专业网站?
如何快速完成中国万网建站详细流程?
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
Laravel Fortify是什么,和Jetstream有什么关系
LinuxShell函数封装方法_脚本复用设计思路【教程】
如何用AI帮你把自己的生活经历写成一个有趣的故事?
Laravel如何记录自定义日志?(Log频道配置)
Swift中swift中的switch 语句
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
简历没回改:利用AI润色让你的文字更专业
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
焦点电影公司作品,电影焦点结局是什么?
Laravel如何使用Livewire构建动态组件?(入门代码)
如何用西部建站助手快速创建专业网站?
Laravel怎么在Controller之外的地方验证数据
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
如何在建站之星网店版论坛获取技术支持?
安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出
海南网站制作公司有哪些,海口网是哪家的?
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
如何挑选最适合建站的高性能VPS主机?
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
JavaScript如何实现继承_有哪些常用方法


目并配置 Composer