如何使用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如何实现继承_有哪些常用方法