joachim-n/drupal-core-development-project

用于开发 Drupal 核心的 Composer 项目

1.0.15 2024-06-25 13:49 UTC

README

这是一个用于开发 Drupal 核心的 Composer 项目模板。

允许以下操作

  • 干净地克隆 Drupal 核心代码。
  • 安装 Drupal 核心的 Composer 依赖,因此 Drupal 可以像正常一样安装和运行。
  • 您可能想要的其他 Composer 包,例如 Drush、Devel 模块、Admin Toolbar 模块和 Devel Accessibility,也可以安装,但不会影响 Drupal 核心部分中的 composer 文件。
  • 可以通过 Composer 安装贡献模块(通常 Composer 会拒绝安装它们,因为它们的 info.yml 文件未声明与核心 11.x 的兼容性)。
  • 包括贡献模块在内的其他包可以作为 git 克隆安装,以与 Drupal 核心并行开发。

路线图

将其引入 Drupal 核心!请参阅 https://www.drupal.org/project/drupal/issues/1792310

安装

基本安装

要安装 Drupal 项目以用于 Drupal 核心开发

$ composer create-project joachim-n/drupal-core-development-project

Composer 会将 Drupal 核心克隆到项目内的 'repos/drupal' 目录,然后在安装 Drupal 核心时将其符号链接到项目中。

Drupal 核心将检出其默认分支,目前是 11.x。如果您想要在不检出 11.x 的情况下开始不同的分支,可以使用 --no-install 选项与 composer create-project 命令一起使用,然后更改 Drupal 核心克隆的分支,然后执行 composer install

一旦 Composer 安装完成,您就可以像平常一样安装 Drupal,无论是使用 drush si 还是通过 Web UI。

DDEV 上的安装

首先,确保您的 DDEV 版本至少为 1.23.0。接下来,为您的项目创建一个新文件夹并将 cd 进入该文件夹。然后

$ ddev config --project-type=drupal --php-version=8.3
$ ddev start
$ ddev composer create joachim-n/drupal-core-development-project
$ ddev config --update
$ ddev restart

使用 justafish/ddev-drupal-core-dev DDEV 扩展在 DDEV 上安装

要使用 justafish/ddev-drupal-core-dev DDEV 扩展,您需要对该扩展的安装说明进行以下更改

  • 对于 ddev config,指定 --project-type=drupal
  • 在执行 ddev get justafish/ddev-drupal-core-dev 之前执行 composer install
  • 执行 ln -s web/autoload.php . 以使扩展的 ddev drupal 命令找到自动加载器。(有一个合并请求来删除这个需求:justafish/ddev-drupal-core-dev#35
  • 不要执行 drupal install。相反,执行 ddev drush si --db-url=sqlite://sites/default/files/.ht.sqlite?module=sqlite -y(您可能需要手动创建 web/sites/default/files)当通过 Composer 链接 drupal 包时,drupal install 命令不起作用。

要运行 PHPUnit 测试,您需要调整 DDEV phpunit 命令,直到 justafish/ddev-drupal-core-dev#37 被修复。

安装其他包

您可以像正常项目一样安装任何 Composer 包。这不会影响 Drupal 核心文件。

要使用 Composer,您需要在项目的根目录而不是 Drupal 核心文件夹中。

如果 Drupal 核心检出在功能分支上,Composer 可能会抱怨依赖未满足,因为它看不到功能分支作为满足依赖项。您可以

  • 暂时将Drupal代码切换回主分支,执行Composer任务,然后切换回来。
  • 在项目composer.json的repositories部分定义版本。
  • 在项目composer.json中定义分支别名。

从路径仓库安装其他包

您可以像安装Drupal核心一样从路径仓库安装额外的包(尽管其他包不需要像Drupal核心那样进行所有调整)。这可以用于与核心一起开发包和模块。

  1. 创建模块或包的git克隆。可以使用repos/文件夹进行此操作。从主分支开始是最简单的,这样Composer会将它视为已安装的版本,并且依赖关系可以正常工作。
  2. 为包定义路径仓库。有关详细信息,请参阅https://getcomposer.org.cn/doc/05-repositories.md#path
  3. 对包执行composer require

现在,您可以将包切换到功能分支,例如来自合并请求的一个分支,以进行功能或错误修复工作。

如果您需要执行Composer操作,Composer可能会抱怨功能分支不满足要求。您可以选择以下操作之一

  • 使用git检出主分支,执行Composer操作,然后返回到功能分支。
  • 通过在composer.json中声明路径仓库的"versions"选项来定义Composer看到的此包的版本。

限制

贡献和自定义测试

贡献和自定义模块测试无法运行。有关详细信息,请参阅#14

'无法扫描类'错误信息

在某些Composer命令期间,您可能会看到多次此错误信息

无法在[Drupal类文件名]内部扫描类。

这些是无害的,可以忽略。

开发Drupal核心

您可以使用位于repos/drupal/的Drupal核心git克隆以任何方式使用:创建功能分支、从drupal.org问题分支克隆等。您对git克隆中文件所做的更改会影响项目,因为git克隆是链接到其中的。

管理Composer项目

对Drupal核心git克隆的composer.json所做的更改将由Composer考虑。例如,如果您从Drupal核心的主分支拉取更改了Composer依赖关系,尤其是如果您更改到不同的核心主分支或次分支,您应该在项目中运行composer update来安装这些。

运行测试

以下内容是运行测试所需的。

PHPUnit配置

使用此设置运行测试的最简单方法是,将phpunit.xml文件放在项目根目录中,然后从那里运行测试。

$ vendor/bin/phpunit web/core/PATH-TO-TEST-FILE/TestFile.php
DDEV上
  1. 复制此模板提供的phpunit-ddev.xml文件,并将其重命名为phpunit.xml
$ cp phpunit-ddev.xml phpunit.xml
  1. 将BROWSERTEST_OUTPUT_BASE_URL的值更改为项目的宿主URL。
在其他平台上
  1. 将Drupal核心的示例phpunit.xml.dist文件复制到项目根目录,并将其重命名为phpunit.xml
$ cp web/core/phpunit.xml.dist phpunit.xml
  1. 更改bootstrap属性,以确保路径正确。
bootstrap="web/core/tests/bootstrap.php"

调试

您可以在打开repos/drupal文件夹的IDE中设置调试,以便它识别从项目根目录运行的过程。

例如,在VSCode中,在调试器配置中这样做:

"pathMappings": {
  // Make this work with the root project.
  "/ABSOLUTE/PATH/TO/PROJECT/repos/drupal": "${workspaceRoot}"
}

技术细节

本文件的其余部分是您只需要知道您正在处理此项目模板或调试它的技术细节。

如何工作

项目根目录的composer.json使用Composer路径仓库,因此当安装drupal/drupal包时,它会从Drupal核心git克隆中符号链接进来,链接到克隆检出的分支。

Drupal 核心本身在其顶级 composer.json 中定义了路径存储库。这些需要在项目根目录的 composer.json 中覆盖,以便它们指向 Drupal 核心git克隆内部。

此外,drupal/core-recommended 和 drupal/core-dev 包的路径被定义为路径存储库,这样在项目中就会尊重那些元包中固定的包版本。这意味着将安装与在 Drupal 核心git克隆上安装 Composer 包相同的版本。

通过 ComposerCoreVersionsLeniency Composer 脚本来使贡献模块可安装。

手动安装

将此模板的存储库克隆到“drupal-dev”等位置。

$ cd drupal-dev

# Create a folder in which to store git clones, which Composer will symlink in.
$ mkdir repos
$ cd repos

# Clone Drupal core, to whatever branch you like.
$ git clone --branch 9.2.x https://git.drupalcode.org/project/drupal.git

# Go back to the project root.
$ cd ..

# Install packages with Composer.
$ composer install

Drupal 核心git克隆将是干净的,除了

	sites/default/settings.php
	vendor

由于它没有顶级目录下的 .gitignore,如果你愿意,可以添加一个来忽略这些文件。

项目模板开发安装

为了测试 Composer 如何从模板创建新项目,你需要模板存储库的 git 克隆。

在单独的位置,执行以下操作

$ composer create-project joachim-n/drupal-core-development-project NEW_PROJECT_DIRECTORY --stability=dev --repository='{"url":"/path/to/git/clone/of/project/template/","type":"vcs"}'

解决方案

为了使 Drupal 核心在项目内链接时正确工作,需要采取几个解决方案。这些都在安装过程中由 Composer 脚本处理。详细信息如下。

一旦 https://www.drupal.org/project/drupal/issues/1792310 被修复,其中大多数如果还不是所有这些将不再需要。

供应商文件夹

供应商文件夹必须链接到 Drupal 核心存储库,否则核心中期望找到 Composer 自动加载器的代码将失败。

这是在初始安装后由 Composer 脚本完成的。手动命令是

ln -s ../../vendor ./repos/drupal/vendor

应用根文件补丁

在将索引.php 和 update.php 脚本文件复制到 web/index.php 之后,必须对这些文件进行补丁处理,否则 DrupalKernel 会错误地猜测 Drupal 应用根位于 Drupal 核心git克隆内部,这意味着它找不到 settings.php 文件。

这是在初始安装后由 Composer 脚本完成的。手动命令是

cd web && patch -p1 <../scaffold/scaffold-patch-index-php.patch
cd web && patch -p1 <../scaffold/scaffold-patch-update-php.patch

有关更多详细信息,请参阅 https://www.drupal.org/project/drupal/issues/3188703

Drush 重建命令

如果存在贡献模块,Drush cache:rebuild 命令将无法正常工作,因为它调用 drupal_rebuild(),这使得 DrupalKernel 错误地猜测应用根。

此项目模板包含一个 /drush 文件夹,该文件夹包含一个命令类,该类替换该命令,并使用自定义代码来正确处理应用根。

Simpletest 文件夹

在运行浏览器测试时,FunctionalTestSetupTrait::prepareEnvironment() 中 Drupal 的初始设置会在具有已解析符号链接的真实文件位置创建一个站点文件夹,因此 repos/drupal/sites/simpletest,但在请求测试站点期间,Drupal 会查找 /web/sites/simpletest

此外,浏览器测试输出的 HTML 文件被写入到 Drupal 核心git克隆中,因此 PHPUnit 输出中显示的 URL 是不正确的。

针对这两个问题的修复方案是在 web 根目录中创建 simpletest 站点文件夹并将其符号链接到 Drupal 核心git克隆。

这是在初始安装后由 Composer 脚本完成的。手动命令是

mkdir -p web/sites/simpletest
ln -s ../../../web/sites/simpletest repos/drupal/sites

Drupal composer 测试类的自动加载

Drupal 的 /composer 文件夹没有符号链接,因此对 Composer 来说不可见。它对于某些测试是必需的,因此被声明为自动加载位置。