可以使用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
TLDR:post-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