在WordPress主题或插件中使用Composer时避免依赖冲突

文 / @WordPress主题

关于使用Composer解决依赖包冲突的问题

我是一个有经验的WordPress开发者,很可能您已经在自己的项目中使用了Composer为我们安装依赖包。Composer使用丰富的PHP开源程序包提供了非常大的便利。在自己的网站上使用Composer,依赖是可控的,遇到极赖冲突的机会比较小。

但是如果您打算把自己开发的主题或插件共享出去供大家使用,使用Composer的时候就要小心了。因为您不知道使用您插件的网站使用了哪些插件,更无法知道这些插件是否使用Composer安装了相同但不兼容的PHP包。哪个先加载,冲突的结果是什么?

尝试解决Composer依赖冲突

有两个Composer工具,Imposter插件目的就是帮助您使用自己的命名空间包装使用Composer安装的依赖包,从而避免依赖冲突。

使用这两个工具都需要在comopser.json中进行一些设置,然后花一些时间测试他们是否能正确处理您的composer依赖。

下面是我在一个插件中使用imposter-plugin处理league/container依赖的示例,注意下面代码中的「extra」部分,这是我们需要添加的配置代码。

{
    "name":"wenprise/project-name",
    "description":"Demoproject",
    "require":{
        "php":">=7.1",
        "league/container":"^3.3",
        "psr/container":"^1.0",
        "psr/container-implementation":"^1.0",
        "typisttech/imposter-plugin":"^0.6.0"
    },
    "autoload":{
        "psr-4":{
            "Wenprise\\ProjectName\\":"src/"
        }
    },
    "extra":{
        "imposter":{
            "namespace":"Wenprise\\ProjectName\\Vendor",
            "excludes":[
                "psr/container-implementation"
            ]
        }
    }
}

编辑好composer.json后,运行composer update,然后打开league/container看一下imposter插件为我们做的工作。

<?php

namespace Wenprise\ProjectName;

use Wenprise\ProjectName\Vendor\League\Container\Container as Container;

我们可以发现,命名空间如预期,被添加了「Wenprise\ProjectName」前缀,这样处理后,league/container包就运行在我们自己的命名空间之内了,等于变成了这个插件专属的代码。其他主题或插件使用的是哪个league/container就和我们的插件没关系了。

一些限制和类似工具

截止本文发布之前,Imposter插件的最新版本是0.6.0,离1.0版本的发布还有一段距离。经过我们的测试,使用此插件处理不包含其他依赖的composer包基本都可以正确处理,但是如果需要处理的composer包又依赖了其他的包,使用Imposter处理就有很大的机会遇到错误。建议使用此插件进行插件或主题开发的时候,进行充分的测试。

Mozart和PHP-Scoper是另外两个类似的工具,未发布稳定的1.0版本。有需要的朋友可以同时测试一下,看那个工具最能满足您的需要。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。