一個(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ā)。 |
archive
command is executed.post-archive-cmd: occurs after the archive
command is executed.
注意:Composer 不會(huì)去執(zhí)行任何依賴包中定義的 install
或 update
相關(guān)腳本。因此你不應(yīng)該在依賴包中申明 pre-update-cmd
或 pre-install-cmd
。如果你需要在執(zhí)行 install
或 update
命令前使用腳本,請(qǐng)確保它們已被定義在根包中。
在 composer.json
的根 JSON 對(duì)象中應(yīng)該有一個(gè)名為 "scripts"
的屬性,它包含有一系列的事件名稱,以及對(duì)應(yīng)的事件腳本。一個(gè)事件的腳本可以被定義為一個(gè)字符串(僅適用于單個(gè)腳本)或數(shù)組(單個(gè)或多個(gè)腳本)。
對(duì)于任何給定的事件:
腳本定義實(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)行事件腳本,可以使用下面的語(yǔ)法結(jié)構(gòu):
composer run-script [--dev] [--no-dev] script
例如 composer run-script post-install-cmd
將會(huì)運(yùn)行所有 post-install-cmd 事件下定義的腳本。
更多建議: