将 PHP 应用快速打包为 PHAR

humbug/box 是一款快速的、零配置的 PHAR 打包工具。

还记得前些天的《SMProxy,让你的数据库操作快三倍!》吗,该项目的 PHAR 便是使用 Box 打包完成的。

该项目是 box-project/box2 的 Fork 分支,原项目已经不再维护。新项目的作者呼吁我们支持该 Fork。

Box 的可配置项有很多,为了能够快速帮助大家了解用法,接下来我将使用 SMProxybox.json 作为例子给大家做一个简单的介绍。

推荐一篇预备知识,可以帮你简单了解 PHAR 的部分用途:使用phar上线你的代码包

首先,正如 Box 作者的描述:

Fast, zero config application bundler with PHARs.

我们默认无需任何配置,在你的 PHP 应用的根目录执行:

composer require humbug/box
vendor/bin/box compile 

即可生成一个基本的 PHAR 包文件。

Box 的配置文件为应用根目录的 box.json,例如 SMProxy 项目的该文件内容为:

{
    "main": "bin/SMProxy",
    "output": "SMProxy.phar",
    "directories": [
        "bin",
        "src"
    ],
    "finder": [
        {
            "notName": "/LICENSE|.*\\.md|.*\\.dist|composer\\.json|composer\\.lock/",
            "exclude": [
                "doc",
                "docs",
                "test",
                "test_old",
                "tests",
                "Tests",
                "vendor-bin"
            ],
            "in": "vendor"
        },
        {
            "name": "composer.json",
            "in": "."
        }
    ],
    "compression": "NONE",
    "compactors": [
        "KevinGH\\Box\\Compactor\\Json",
        "KevinGH\\Box\\Compactor\\Php"
    ],
    "git": "phar-version"
}
  • main 用于设定应用的入口文件,也就是打包 PHAR 后,直接运行该 PHAR 包所执行的代码,你可以在某种意义上理解为 index.php
  • output 用于设定 PHAR 的输出文件,可以包含目录,相对路径或绝对路径。
  • directories 用于指定打包的 PHP 源码目录。
  • finder 配置相对比较复杂,底层是使用 Symfony/Finder 实现,与 PHP-CS-Fixer 的 Finder 规则类似。在以上例子中,包含两个 Finder;第一个定义在 vendor 文件夹内,排除指定名称的文件和目录;第二个表示包含应用根目录的 composer.json
  • compression 用于设定 PHAR 文件打包时使用的压缩算法。可选值有:GZ(最常用) / BZ2 / NONE(默认)。但有一点需要注意:使用 GZ 要求运行 PHAR 的 PHP 环境已启用 Gzip 扩展,否则会造成报错。
  • compactors 用于设定压缩器,但此处的压缩器不同于上文所介绍的 compression;一个压缩器类实例可压缩特定文件类型,降低文件大小,例如以下 Box 自带的压缩器:
    • KevinGH\Box\Compactor\Json:压缩 JSON 文件,去除空格和缩进等。
    • KevinGH\Box\Compactor\Php:压缩 PHP 文件,去除注释和 PHPDoc 等。
    • KevinGH\Box\Compactor\PhpScoper:使用 humbug/php-scoper 隔离代码。
  • git 用于设定一个「占位符」,打包时将会扫描文件内是否含有此处定义的占位符,若存在将会替换为使用 Git 最新 Tag 和 Commit 生成的版本号(例如 2.0.02.0.0@e558e33)。你可以参考 这里 的代码来更加深入地理解该用法。

我目前常用的配置大概就是这些,强力推荐看看官方的 配置文档 来了解更多的配置项、示例和默认值,以及它们的用法;思路清晰、简明扼要。

最后,推荐关注 SMProxy,英文文档和上文介绍的 PHAR 打包部分,基本都是由我完成,有任何疑问欢迎通过 Issue 联系。

广告:https://wi1dcard.cn/

本作品采用《CC 协议》,转载必须注明作者和本文链接
Former WinForm and PHP engineer. Now prefer Golang and Rust, and mainly working on DevSecOps and Kubernetes.
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4
[root@VM_0_14_centos blog]# vendor/bin/box compile

    ____
   / __ )____  _  __
  / __  / __ \| |/_/
 / /_/ / /_/ />  <
/_____/\____/_/|_|

Box version 3.4.0@4eeb285

 // Loading without a configuration file.

In Assertion.php line 2550:

  File "/usr/share/nginx/html/blog/index.php" was expected to exist.

compile [-c|--config CONFIG] [--debug] [--no-parallel] [--no-restart] [--dev] [--no-config] [--with-docker] [-d|--working-dir WORKING-DIR]

 [ERROR] The configuration file is invalid.

新建一个index.php,然后生成index.phar

5年前 评论

打包后,artisan命令怎么运行?

2年前 评论
游离不2

打包依赖包的时候特别慢,有加速方案?

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
67
粉丝
590
喜欢
1235
收藏
1133
排名:13
访问:32.4 万
私信
所有博文
社区赞助商