为Composer创建一个事件/插件

Gil*_*Dev 7 php composer-php

我开发了一个便携式WebServer,我也正在创建一个便携式控制台,以便使用Composer.

我有个问题.我需要创建一个插件来向Composer添加其他行为.

我需要在使用Composer下载任何软件包时,它会编辑该软件包的composer.json"脚本",以便它可以在便携式控制台上运行.

下载Laravel时,例如:

原始composer.json:

{
    "name": "laravel/laravel",
    ...
    "scripts": {
        "post-root-package-install": [
            "php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        ...
    },
    ...
}
Run Code Online (Sandbox Code Playgroud)

由插件编辑的composer.json:

{
    "name": "laravel/laravel",
    ...
    "scripts": {
        "post-root-package-install": [
            "F:/portable_php_path/php.exe -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        ...
    },
    ...
}
Run Code Online (Sandbox Code Playgroud)
  • 请注意,已经为php.exe生成了物理路径,因为在便携版本中它可以在任何路径中.

(我的问题是创建composer插件.使用PHP编辑composer.json没有问题.)

我阅读了在作曲家网站上创建插件的教程,但我很困惑.(https://getcomposer.org/doc/articles/plugins.md)

如果有另一种方法可以做到这一点,那也很有趣.我接受其他建议和想法.

感谢任何能提供帮助的人.

[抱歉我的英文不好]

ari*_*tll 3

我认为你可以有一个插件实现PluginInterfaceEventSubscriberInterface

public static function getSubscribedEvents()
{
    return [
        'post-package-install' => 'onPostPackageInstall'
        // hook  post-package-install using onPostPackageInstall method
    ];
}

public function onPostPackageInstall(\Composer\Installer\PackageEvent $event)
{
    $vendorDir = $event->getComposer()->getConfig()->get('vendor-dir') . '/';

    /** @var InstallOperation $item */
    foreach ($event->getOperations() as $item) {

        $packageInstalled = $item->getPackage()->getName();
        // do any thing with the package name like `laravel/laravel`
        //You can now edit the composer.json file 

        echo $vendorDir . $packageInstalled . '/composer.json';

    }

}
Run Code Online (Sandbox Code Playgroud)