Composer 腳本

2018-09-28 20:24 更新

腳本

什么是腳本?

一個腳本,在 Composer 中,可以是一個 PHP 回調(定義為靜態(tài)方法)或任何命令行可執(zhí)行的命令。腳本對于在 Composer 運行過程中,執(zhí)行一個資源包的自定義代碼或包專用命令是非常有用的。

注意:只有在根包的 composer.json 中定義的腳本才會被執(zhí)行。即便根包的外部依賴定義了其自身的腳本,Composer 也不會去執(zhí)行這些額外的腳本。

事件名稱

Composer 在運行過程中將會觸發(fā)以下事件:

事件名稱詳細說明
**pre-install-cmd**在 `install` 命令執(zhí)行前觸發(fā)。
**post-install-cmd**在 `install` 命令執(zhí)行后觸發(fā)。
**pre-update-cmd**在 `update` 命令執(zhí)行前觸發(fā)。
**post-update-cmd**在 `update` 命令執(zhí)行后觸發(fā)。
**pre-status-cmd**在 `status` 命令執(zhí)行前觸發(fā)。
**post-status-cmd**在 `status` 命令執(zhí)行后觸發(fā)。
**pre-package-install**在資源包安裝前觸發(fā)。
**post-package-install**在資源包安裝后觸發(fā)。
**pre-package-update**在資源包更新前觸發(fā)。
**post-package-update**在資源包更新后觸發(fā)。
**pre-package-uninstall**在資源包被卸載前觸發(fā)。
**post-package-uninstall**在資源包被卸載后觸發(fā)。
**pre-autoload-dump**在自動加載器被轉儲前觸發(fā),無論是 `install`/`update` 還是 `dump-autoload` 命令都會觸發(fā)。
**post-autoload-dump**在自動加載器被轉儲后觸發(fā),無論是 `install`/`update` 還是 `dump-autoload` 命令都會觸發(fā)。
**post-root-package-install**在 `create-project` 命令期間,根包安裝完成后觸發(fā)。
**post-create-project-cmd**在 `create-project` 命令執(zhí)行后觸發(fā)。
  • pre-archive-cmd: occurs before the archive command is executed.
  • post-archive-cmd: occurs after the archive command is executed.

    注意:Composer 不會去執(zhí)行任何依賴包中定義的 installupdate 相關腳本。因此你不應該在依賴包中申明 pre-update-cmdpre-install-cmd。如果你需要在執(zhí)行 installupdate 命令前使用腳本,請確保它們已被定義在根包中。

定義腳本

composer.json 的根 JSON 對象中應該有一個名為 "scripts" 的屬性,它包含有一系列的事件名稱,以及對應的事件腳本。一個事件的腳本可以被定義為一個字符串(僅適用于單個腳本)或數(shù)組(單個或多個腳本)。

對于任何給定的事件:

  • 腳本將按照事件和定義的順序觸發(fā)。
  • 一個腳本數(shù)組可以包含 PHP 回調和命令行可執(zhí)行命令。
  • 由 PHP 類文件包含的回調,其存放的位置必須確保 Composer 能夠正確的載入。

腳本定義實例:

{
    "scripts": {
        "post-update-cmd": "MyVendor\\MyClass::postUpdate",
        "post-package-install": [
            "MyVendor\\MyClass::postPackageInstall"
        ],
        "post-install-cmd": [
            "MyVendor\\MyClass::warmCache",
            "phpunit -c app/"
        ]
    }
}

使用前面定義的例子,這里的 MyVendor\MyClass 類,就可以被使用來執(zhí)行 PHP 的回調:

<?php

namespace MyVendor;

use Composer\Script\Event;

class MyClass
{
    public static function postUpdate(Event $event)
    {
        $composer = $event->getComposer();
        // do stuff
    }

    public static function postPackageInstall(Event $event)
    {
        $installedPackage = $event->getOperation()->getPackage();
        // do stuff
    }

    public static function warmCache(Event $event)
    {
        // make cache toasty
    }
}

當一個事件被觸發(fā),Composer 的內部事件處理程序將接收一個 Composer\Script\Event 對象,這是傳遞給您的 PHP 回調的第一個參數(shù)。這個 Event 對象擁有一些 getter 方法來幫助你取得當前事件的上下文:

  • getComposer(): 返回當前的 Composer\Composer 對象實例。
  • getName(): 返回事件名稱的字符串。
  • getIO(): 返回當前的 輸入\輸出 流,它實現(xiàn)了 Composer\IO\IOInterface 接口,以便在控制臺中使用。

手動運行腳本

如果你想手動運行事件腳本,可以使用下面的語法結構:

composer run-script [--dev] [--no-dev] script

例如 composer run-script post-install-cmd 將會運行所有 post-install-cmd 事件下定義的腳本。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號