eckinox / installer-plugin
一个简单的Composer插件,用于安装包含额外文件和配置的元包。
2.0.2
2022-07-13 18:47 UTC
Requires
- composer-plugin-api: ~1 || ~2
- react/promise: ^1.2 || ^2.7
Requires (Dev)
- composer/composer: ^1.3
- phpunit/phpunit: ^9.5
README
一个简单的Composer插件,用于安装(元)包,包含额外文件和配置。
使用方法
要开始使用,只需在项目中通过以下方式引入此插件:
composer require --dev eckinox/installer-plugin
完成上述操作后,您可以使用eckinox-metapackage类型要求任何Composer包。
创建eckinox-metapackage包
Eckinox元包与所有常规包相同,只有一个例外:它们可以在根目录中包含一个replicate目录。
每当安装此类类型的包时,该包的replicate目录中的每个文件和目录都将原样复制到项目目录中。
如果replicate目录中已存在项目中的目录,则其文件将简单地追加到现有目录中。原始文件不会被删除。
但是,如果项目中的现有文件与包的replicate目录中的另一个文件同名,则会覆盖项目中的现有文件。
通过处理器添加自定义逻辑
如果您需要在复制过程中添加额外的逻辑和处理,您可以在包中创建一个处理器类。
处理器类扩展Eckinox\Composer\HandlerInterface,必须在包的composer.json文件中声明如下
... "extra": { "class": "Eckinox\\PackageName\\YourHandler" }, ...
您的处理器类必须定义以下方法
postFileCreationCallback:定义文件首次在根项目中创建后会发生什么。handleExistingFile:定义要复制的文件在根项目中已存在时会发生什么。
以下是一个非常基本的处理器类示例,它在主项目中首次复制时将rename-me.txt文件重命名为renamed.txt。
<?php namespace Eckinox\Composer\Tests\MockPackage; use Composer\IO\IOInterface; use Composer\Package\PackageInterface; use Composer\Util\Filesystem; use Eckinox\Composer\HandlerInterface; class ReplicationHandler implements HandlerInterface { public function __construct( private PackageInterface $package, private Filesystem $filesystem, private IOInterface $io) { } public function handleExistingFile(string $packageFilename, string $projectFilename, ?string $currentlyInstalledFilename = null) { } public function postFileCreationCallback(string $projectFilename) { if (basename($projectFilename) == "rename-me.txt") { $newFilename = substr($projectFilename, 0, strlen($projectFilename) - 13) . "renamed.txt"; rename($projectFilename, $newFilename); } } }
测试
为了测试此插件,请确保已安装所有依赖项,并运行:
composer test
测试用例位于tests/目录中,并由PHPUnit执行。