从packagist.org安装时,php composer中的post require hook不起作用


post-require hook in php composer not working when installing from packagist.org

可以使用composer require vendor/package-name等命令从packagist.org安装PHP包。现在,composer文档指出,在composer执行过程中有几个事件的挂钩:

用Composer的话说,脚本可以是PHP回调(定义为静态方法),也可以是任何命令行可执行命令。脚本对于在Composer执行过程中执行包的自定义代码或包特定命令非常有用。

文件进一步说明:

注意:只执行根包的composer.json中定义的脚本。如果根包的依赖项指定了自己的脚本,Composer不会执行这些额外的脚本

这是否意味着当需要通过composer require vendor/package-name从packagist.org获得包时,无法执行PHP代码?

几年前,在composer问题队列中对这个主题进行了相当长的讨论。

https://github.com/composer/composer/issues/1193

TLDRpost-update-cmd钩子不支持它,但可以通过编写composer插件来绕过它。例如,我做了一个通用插件,为任何新的或更改的包运行compile挂钩:

https://github.com/civicrm/composer-compile-plugin

文档中的一个示例:

{
  "name": "foo/bar",
  "require": {
    "civicrm/composer-compile-plugin": "~0.8",
    "scssphp/scssphp": "1.2.0",
    "padaliyajay/php-autoprefixer": "~1.2"
  },
  "autoload": {"psr-4": {"ScssExample''": "src"}},
  "extra": {
    "compile": [
      {"run": "@php-method ''ScssExample''ScssExample::make"}
    ]
  }
}

以及相应的回调:

namespace ScssExample;
class ScssExample
{
  public static function make(array $task)
  {
    $scssCompiler = new 'ScssPhp'ScssPhp'Compiler();
    $scss = 'div { .foo { hyphens: auto; } }';
    $css = $scssCompiler->compile($scss);
    $autoprefixer = new 'Padaliyajay'PHPAutoprefixer'Autoprefixer($css);
    file_put_contents("build.css", $autoprefixer->compile());
  }
}

composer将在使用require安装请求的包后调度post-update-cmd事件。这将执行根composer.json中为此事件定义的脚本。参见此示例场景:

composer.json

{
    "autoload": {
        "psr-4": {
            "fknffa''": "src"
        }
    },
    "scripts": {
        "post-update-cmd": [
            "fknffa''floom::sayHello"
        ]
    }
}

src/floom.php

<?php
namespace fknffa;
class floom
{
    public static function sayHello()
    {
        print 'I am in ' . __METHOD__ . PHP_EOL;
    }
}

执行要求命令

$ composer require twig/twig
Using version ^1.23 for twig/twig
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing twig/twig (v1.23.1)
Writing lock file
Generating autoload files
> fknffa'floom::sayHello
I am in fknffa'floom::sayHello