首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用内置的Composer插件创建一个完整的Composer包?

如何使用内置的Composer插件创建一个完整的Composer包?
EN

Stack Overflow用户
提问于 2018-05-17 02:26:25
回答 1查看 0关注 0票数 0

我要我的包裹随内置的作曲家插件一起运送。

我有这样的结构:

代码语言:txt
复制
composer.json
src/
    ...
plugin/
    composer.json
    src/
        ...

composer.json配置如下:

代码语言:txt
复制
{
    "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就像这样:

代码语言:txt
复制
{
    "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 installcomposer update,一切都很好-插件做了它的事情,这意味着,现在,只是宣布自己在控制台上。

现在,安装之后,如果我输入composer,我希望看到插件宣布自己,和以前一样,对吗?

相反,当它试图引用属于foo/bar包裹。

就好像作曲家忘记了foo/bar-plugin要求foo/bar,由于某些原因,它的类不能自动加载。

有什么理由不能这样吗?为什么不行?

当然,我可以将这些东西打包到单独的外部包中,但是这没有什么意义,因为这些包只是相互依赖的-它们实际上是一个单元,将它们打包为两个包将导致一个混乱的主要版本随着每个小的更改而增加,基本上是每个版本的foo/bar会破裂foo/bar-plugin

理想情况下,我想简单地将Composer插件直接添加到主包中,但由于某种原因,这似乎是不可能的吗?只有具有类型的包composer-plugin似乎可以添加插件吗?

EN

回答 1

Stack Overflow用户

发布于 2018-05-17 12:17:50

如果插件本质上是包的一部分,则不应该使用它。作曲家提供了其他选择。

正如Jens在对问题的评论中提到的,在composer.json。可以在内部调用shell命令,但也可以调用静态类方法。

关于插件解决方案-Composer在其站点上明确提到了这一点:

在安装或更新之前,Composer对依赖关系的状态不作任何假设。因此,不应在预更新-cmd或预安装-cmd事件挂钩中指定需要Composer托管依赖项的脚本。如果需要在安装或更新之前执行脚本,请确保它们是独立包含在根包中的。

无论如何-为你提供一个解决方案:放弃‘插件’的方法。相反,修改您的composer.json文件,如下所示:

json

代码语言:txt
复制
{
    "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:

SRC/Composer/Plugin.php

代码语言:txt
复制
<?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/:

SRC/Test.php

代码语言:txt
复制
<?php

namespace Foo\Bar;

/**
 * Test class.
 */
class Test
{
    const TEST_CONST = "HERE I AM";
}

运行这个,检查一下,结果如何。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100004515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档