我要我的包裹随内置的作曲家插件一起运送。
我有这样的结构:
composer.json
src/
...
plugin/
composer.json
src/
...
根composer.json
配置如下:
{
"name": "foo/bar",
"type": "library",
"autoload": {
"psr-4": {
"Foo\\Bar\\": "src/"
}
},
"repositories": [
{
"type": "path",
"url": "./tools",
"options": {
"symlink": false
}
}
],
"require": {
"foo/bar-plugin": "*"
}
}
以及内置的作曲家插件plugin/composer.json
就像这样:
{
"name": "foo/bar-plugin",
"type": "composer-plugin",
"require": {
"composer-plugin-api": "^1",
"composer/composer": "^1",
"foo/bar": "*"
},
"autoload": {
"psr-4": {
"Foo\\Bar\\Plugin\\": "src/"
}
},
"extra": {
"class": "Foo\\Bar\\Plugin\\MyComposerPlugin"
}
}
注意这里有一个双向依赖-插件依赖于foo/bar
,而项目本身取决于foo/bar-plugin
。
这是奇怪的地方。在一个新的安装过程中。composer install
或composer update
,一切都很好-插件做了它的事情,这意味着,现在,只是宣布自己在控制台上。
现在,安装之后,如果我输入composer
,我希望看到插件宣布自己,和以前一样,对吗?
相反,当它试图引用属于foo/bar
包裹。
就好像作曲家忘记了foo/bar-plugin
要求foo/bar
,由于某些原因,它的类不能自动加载。
有什么理由不能这样吗?为什么不行?
当然,我可以将这些东西打包到单独的外部包中,但是这没有什么意义,因为这些包只是相互依赖的-它们实际上是一个单元,将它们打包为两个包将导致一个混乱的主要版本随着每个小的更改而增加,基本上是每个版本的foo/bar
会破裂foo/bar-plugin
。
理想情况下,我想简单地将Composer插件直接添加到主包中,但由于某种原因,这似乎是不可能的吗?只有具有类型的包composer-plugin
似乎可以添加插件吗?
发布于 2018-05-17 12:17:50
如果插件本质上是包的一部分,则不应该使用它。作曲家提供了其他选择。
正如Jens在对问题的评论中提到的,在composer.json
。可以在内部调用shell命令,但也可以调用静态类方法。
关于插件解决方案-Composer在其站点上明确提到了这一点:
在安装或更新之前,Composer对依赖关系的状态不作任何假设。因此,不应在预更新-cmd或预安装-cmd事件挂钩中指定需要Composer托管依赖项的脚本。如果需要在安装或更新之前执行脚本,请确保它们是独立包含在根包中的。
无论如何-为你提供一个解决方案:放弃‘插件’的方法。相反,修改您的composer.json
文件,如下所示:
{
"name": "foo/bar",
"type": "library",
"autoload": {
"psr-4": {
"Foo\\Bar\\": "src/"
}
},
"require": {
},
"scripts": {
"post-install-cmd": [
"Foo\\Bar\\Composer\\Plugin::postInstall"
],
"post-update-cmd": [
"Foo\\Bar\\Composer\\Plugin::postUpdate"
]
}
}
另外,在src/Composer
文件夹创建Plugin.php
:
<?php
namespace Foo\Bar\Composer;
use Foo\Bar\Test;
/**
* Composer scripts.
*/
class Plugin
{
public static function postInstall()
{
print_r("POST INSTALL\n");
print_r(Test::TEST_CONST);
print_r("\n");
}
public static function postUpdate()
{
print_r("POST UPDATE\n");
print_r(Test::TEST_CONST);
print_r("\n");
}
}
正如您所看到的,它从Test类中打印常量。在src/
:
<?php
namespace Foo\Bar;
/**
* Test class.
*/
class Test
{
const TEST_CONST = "HERE I AM";
}
运行这个,检查一下,结果如何。
https://stackoverflow.com/questions/-100004515
复制相似问题