fenetikm/autoload-drupal

将 Drupal 模块自动加载到 composer 自动加载器中

安装次数: 183,674

依赖者: 2

建议者: 0

安全: 0

星标: 8

关注者: 2

分支: 6

开放问题: 1

类型:composer-plugin

1.0.0 2023-01-23 21:06 UTC

This package is not auto-updated.

Last update: 2024-09-17 06:34:25 UTC


README

这是一个 Composer 插件,用于将 Drupal 8 模块的自动加载添加到 composer 自动加载器中。

为什么?

你为什么需要这个?Drupal 8 没有自己的自动加载机制吗?

有许多方便的工具(例如静态分析、智能感知)依赖于能够通过 composer 自动加载器加载所有类。不幸的是,由于 Drupal 8 在启动时进行自己的自动加载,使用这些工具至多会变慢(如果你尝试动态启动 Drupal),在最坏的情况下则变得不可能(因为你在虚拟机中运行 Drupal)。一些 IDE(例如 PHPStorm)通过实现自己的发现机制来解决这个问题,但如果你使用的是不这样做的工作区或编辑器,你可能就无计可施了。

这个插件填补了这个空白。

如何实现?

这个插件在很大程度上基于 Composer Merge Plugin。本质上,这个插件在内存中创建一个包含所有指定模块的 composer.json 文件,并将其合并到根 composer.json 文件中,也是在内存中。

安装

在你的 composer.json 中要求插件

标准操作

{
    "require": {
        "fenetikm/autoload-drupal": "1.0.0"
    }
}

配置要自动加载的模块

此插件通过 composer.json 中的 extra 部分进行配置。通常,你希望包含 app/modules/contrib/app/core/modules/app/modules/custom/ 目录。由于 Drupal 可以以多种方式配置,所以没有做任何假设,因此必须全部添加。

你还可以通过指定一个遵循 [ "directory_to_include", [ "module1", "module2" ] ] 模式数组的数组来限制添加到目录中的模块。

例如

    "extra": {
        "autoload-drupal": {
            "modules": [
              "app/modules/contrib/",
              "app/core/modules/",
              [
                  "app/modules/custom/", [ "my_module" ]
              ]
            ]
        }
    }

在这里,所有位于 app/modules/contrib/ 的模块都被添加进来了,所有位于 app/core/modules/ 的模块都被添加进来了,并且只有来自 app/modules/custom/ 目录的 my_module 模块被添加进来。

注意:只有具有 src 目录的模块将被添加进来(因为它们符合 PSR 的类自动加载)。

配置类映射

此外,你还可以添加不在模块之外的类。一个典型的例子是添加 Drupal 测试类。例如

    "extra": {
        "autoload-drupal": {
            "modules": [
                "app/modules/contrib/",
                "app/core/modules/",
                "app/modules/custom/",
            ],
            "classmap": [
                "app/core/tests/Drupal/Tests"
            ]
        }
    }

这将添加该目录中所有的类,例如 UnitTestCaseAssertHelperTraitTest 等。

重新构建自动加载器

包含 Drupal 模块的 composer 自动加载器将在安装和更新时生成。要手动强制刷新它,请执行以下操作

composer dump-autoload

结果

如果你成功设置了它,你将在你的 vendor/composer/autoload_psr4.php 文件中看到类似以下的内容

return array(
  'Drupal\\user\\' => array($baseDir . '/app/core/modules/user/src'),
  'Drupal\\my_module\\' => array($baseDir . '/app/modules/custom/my_module/src'),
  'Drupal\\rad-module\\' => array($baseDir . '/app/modules/contrib/rad-module/src'),
  'Drupal\\entity\\' => array($baseDir . '/app/core/modules/entity/src'),
  );