一個腳本,在 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ā)。 |
archive
command is executed.post-archive-cmd: occurs after the archive
command is executed.
注意:Composer 不會去執(zhí)行任何依賴包中定義的 install
或 update
相關腳本。因此你不應該在依賴包中申明 pre-update-cmd
或 pre-install-cmd
。如果你需要在執(zhí)行 install
或 update
命令前使用腳本,請確保它們已被定義在根包中。
在 composer.json
的根 JSON 對象中應該有一個名為 "scripts"
的屬性,它包含有一系列的事件名稱,以及對應的事件腳本。一個事件的腳本可以被定義為一個字符串(僅適用于單個腳本)或數(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 的回調:
<?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 事件下定義的腳本。
更多建議: