將 PHP 應用快速打包為 PHAR

Wi1dcard發表於2019-01-15

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.

相關文章