【问题标题】:How to require a composer package inside a plugin?如何在插件中要求作曲家包?
【发布时间】:2021-05-13 21:51:33
【问题描述】:

我正在为 Shopware 6 项目编写一个插件,该项目需要一个 composer 包来验证条形码和 EAN。

我在插件文件夹中运行了composer require imelgrat/barcode-validator。它将要求添加到composer.json,但它还将包(及其要求)直接安装在插件vendor 文件夹中,这是错误的。

我怎样才能要求作曲家包并在 Shopware 6 vendor 文件夹中正确安装?

【问题讨论】:

标签: shopware


【解决方案1】:

你不能。如果您使用 zip 分发插件,至少目前不会。如果您打算仅通过 composer 分发,您可以使用 'static-plugins' 文件夹通过 composer 在您的项目中安装您的插件,这也将安装 deps。

现在,如果您想通过商店商店进行分发,您必须在插件 zip 中提供供应商文件夹。您还必须在插件类中主动包含自动加载器。

以下代码 sn-p 放置在插件类的类声明之上,并加载插件的 composer 自动加载器 - 如果它存在。这意味着您仍然可以通过 composer 分发,也可以通过 zip 文件分发。

if (file_exists(dirname(__DIR__) . '/vendor/autoload.php')) {
    $loader = require_once dirname(__DIR__) . '/vendor/autoload.php';
    if ($loader !== true) {
        spl_autoload_unregister([$loader, 'loadClass']);
        $loader->register(false);
    }
}

示例/来源:https://github.com/runelaenen/shopware6-two-factor-auth/blob/master/src/RuneLaenenTwoFactorAuth.php

在打包您的 zip 时,不要忘记包含供应商文件夹,然后您就可以分发您的插件了。

请记住,您不能在一个系统中两次使用一个包,类名必须是唯一的。因此,只包括您肯定不会被核心 Shopware 或其他软件包使用的软件包(及其依赖项)。或者使用 PHP Scoper 之类的工具来确定插件供应商文件夹的范围,这样所有内容始终是唯一的,即使它已经在系统中使用。


路线图

Shopware 在roadmap 上集成了作曲家,因此这可能很快就会过时。然而,在撰写本文时(2021 年 2 月),上述方法是可行的方法。

【讨论】:

    【解决方案2】:

    在您的插件中,您可以包含一个 vendor 文件夹,其中包含您的项目所需的包。

    您不能将软件包包含在其他插件或其他由第 3 方创建的 composer.json / vendor 文件夹中。您只能管理插件包的安装。

    Composer 是一种在设计时考虑到您在受控环境中开发和分发代码的假设的工具。 当您在 WordPress 上发布插件或在 Joomla 上发布模块时,您会将代码发布到您无法控制安装内容的系统上。要克服此限制,您必须使用您知道不会与其他已安装的软件包发生冲突的软件包来准备插件,或者您必须为作曲家软件包添加前缀不会有命名问题。

    这里有更多关于 WordPress 上 PHP 前缀的信息:3rd party dependency conflict in developing Wordpress Plugin

    【讨论】:

      猜你喜欢
      • 2018-04-13
      • 2015-12-25
      • 2012-11-10
      • 2016-04-22
      • 2017-04-07
      • 2015-10-22
      • 1970-01-01
      • 2014-11-27
      相关资源
      最近更新 更多