Composer 腳本

2018-09-28 20:24 更新

腳本

什么是腳本?

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

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

事件名稱

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

事件名稱詳細(xì)說明
**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**在自動(dòng)加載器被轉(zhuǎn)儲(chǔ)前觸發(fā),無論是 `install`/`update` 還是 `dump-autoload` 命令都會(huì)觸發(fā)。
**post-autoload-dump**在自動(dòng)加載器被轉(zhuǎn)儲(chǔ)后觸發(fā),無論是 `install`/`update` 還是 `dump-autoload` 命令都會(huì)觸發(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 不會(huì)去執(zhí)行任何依賴包中定義的 installupdate 相關(guān)腳本。因此你不應(yīng)該在依賴包中申明 pre-update-cmdpre-install-cmd。如果你需要在執(zhí)行 installupdate 命令前使用腳本,請(qǐng)確保它們已被定義在根包中。

定義腳本

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

對(duì)于任何給定的事件:

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

腳本定義實(shí)例:

{
    "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 的回調(diào):

<?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
    }
}

當(dāng)一個(gè)事件被觸發(fā),Composer 的內(nèi)部事件處理程序?qū)⒔邮找粋€(gè) Composer\Script\Event 對(duì)象,這是傳遞給您的 PHP 回調(diào)的第一個(gè)參數(shù)。這個(gè) Event 對(duì)象擁有一些 getter 方法來幫助你取得當(dāng)前事件的上下文:

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

手動(dòng)運(yùn)行腳本

如果你想手動(dòng)運(yùn)行事件腳本,可以使用下面的語(yǔ)法結(jié)構(gòu):

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

例如 composer run-script post-install-cmd 將會(huì)運(yùn)行所有 post-install-cmd 事件下定義的腳本。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)