通过 .info.yml 文件让 Drupal 8 知道你的模块
主题核心:项目元数据
.info.yml 文件(也称为 “info yaml 文件”)是 Drupal 8 模块、主题或安装配置文件的重要组成部分,用于存储项目的元数据。
这些 .info.yml 文件的作用包括:
- 告诉 Drupal 模块、主题或安装配置文件的存在。
- 区分不同类型的主题或模块。
- 为 Drupal Web UI 管理页面提供信息。
- 指定模块启用和禁用的管理条件,以及与 Drupal 版本的兼容性。
- 在其他上下文中的一般管理用途。
更多信息请参阅最新 API:InfoParserInterface.php。(点击“查看源代码”。)
Hello World
以下是我们将要使用的 hello_world.info.yml 文件。如果你要跟随教程,请在模块的根目录中创建一个新文件 hello_world.info.yml,并粘贴以下代码:
name: Hello World Module description: Creates a page showing "Hello World". package: Custom type: module core: 8.x
让我们逐行看看它的作用。
前三行主要用于管理员界面,用户可以在此启用或禁用模块。键 name
和 description
提供了显示在模块管理页面上的文本,而键 package
允许将类似的模块分组。例如,核心模块使用 package: Core
将所有 Drupal 8 自带模块分组;你也可以使用 package: Custom
将自己项目的所有自定义模块分组,以便更容易找到和启用。
type
键(Drupal 8 新增)指定扩展类型,例如模块、主题或配置文件。
对于发布在 drupal.org 上的模块,版本号由打包脚本自动填充。你不需要手动指定,而是直接省略 version 行。
core
键指定了你的模块兼容的 Drupal 核心版本。
name
、type
和 core
是必填键。
指定 core_version_requirement
警告
目前 DrupalCI 不支持测试补丁中修改 core_version_requirement。
你是否需要 core_version_requirement?
定义核心版本约束时的优先级顺序如下:
- 如果在 composer.json 中指定了核心版本要求,它具有最高优先级。
- 如果 composer.json 没有核心版本要求,那么 info.yml 中的 core_version_requirement 优先。
- 如果 info.yml 中没有 core_version_requirement,则使用 info.yml 中 dependencies 部分的主模块所指定的版本。
在需要时指定 core_version_requirement
在模块、主题和配置文件的 *.info.yml 文件中新增的 core_version_requirement 键现在支持 Composer 项目实现的语义化版本管理。这允许它们声明同时兼容多个 Drupal 核心版本。
例如,一个同时兼容 Drupal 8 和 Drupal 9 的模块,可以有这样的 info.yml 文件:
name: My Module type: module core: 8.x core_version_requirement: ^8 || ^9
这表示该模块兼容所有 Drupal 8 和 9 版本。这里需要保留 core: 8.x
,因为 Drupal Core 8.7.7 之前的版本无法识别 core_version_requirement 键。
然而,大多数模块在与 Drupal 9 兼容之前需要移除废弃代码,因此它们无法兼容所有的 Drupal 8 版本。
例如,一个兼容 Drupal 8.8.0 及以上版本和 Drupal 9 的模块,其 info.yml 应如下所示:
name: My Module type: module core_version_requirement: ^8.8 || ^9
此时 core:
键不应使用,以确保 Drupal 8.7.7 之前的版本不会尝试安装该模块。若同时声明 core 和 core_version_requirement,且 core_version_requirement 不是 ^8 || ^9
,则会报错。
core_version_requirement 不能用于限制核心版本低于 8.7.7。例如,core_version_requirement: ^8.7 || ^9
会在解析时出错,因为 ^8.7 会包含 8.7.0 之类的版本,而这些版本不识别 core_version_requirement 键。
因此,当 core_version_requirement 的值不是 ^8 || ^9
时,必须在 Drupal 8.7.7 或更高版本上测试模块。
完整示例
除了前面示例中展示的基本属性外,还有一些附加属性。以下是完整示例:
name: Hello World Module description: Creates a page showing "Hello World". package: Custom type: module core: 8.x dependencies: - drupal:link - drupal:views - paragraphs:paragraphs - webform:webform (>=8.x-5.x) test_dependencies: - drupal:image configure: hello_world.settings php: 5.6 hidden: true required: true # 注意:不要自行添加 'version' 或 'project' 属性。 # 它们会由 drupal.org 打包器自动添加。 # version: 1.0 # project: 'hello_world'
- dependencies:模块依赖的其他模块列表。对 Drupal 核心或贡献模块的依赖应使用 {project}:{module} 格式命名空间,其中 {project} 是项目在 Drupal.org URL 中的名字(例如 drupal.org/project/views),{module} 是模块的机器名称。依赖项还可以包含版本限制,例如
webform:webform (>= 8.x-5.x)
。如果你的模块依赖其他提供的模块或库,它们必须声明在模块的 composer.json 文件中。如果有本地自定义模块相互依赖,可以使用{module}:{module}
或{module}:{submodule}
(用于子模块)。 - test_dependencies:自动化测试所需的其他模块列表(格式同上),但它们不是模块启用所需的依赖。注意,你必须先将 test_dependencies 的更改提交到 Git 仓库,才能运行依赖于它的测试。或者,也可以使用 Composer 管理测试依赖,参见相关文档。
- configure:如果模块提供配置表单,可以在此指定路由地址。这样,它会在 “扩展” 页面(/admin/modules)上显示一个配置链接。
- php: 5.6:指定模块所需的最低 PHP 版本。若用户的 PHP 版本过低,模块将无法启用。这用于避免模块使用了旧 PHP 版本中不存在的新功能时报错。
- hidden: true:隐藏模块,使其不显示在 “扩展” 页面模块列表中。通常用于仅包含测试或仅作为 API 示例的模块。可以通过在 settings.php 中添加
$settings['extension_discovery_scan_tests'] = TRUE
使这些模块可见。 - required: true:表示模块必须启用,且不能被卸载。
- 受限制的属性:由 Drupal 打包系统自动添加(
version
和project
),不要手动写入。
调试 .info.yml 文件
模块未显示在 admin/modules 页面
- 确保 info 文件命名为 {machine_name}.info.yml,并放在模块根目录。
- 确保文件格式正确。例如,冒号 (:) 前无空格,后必须有空格。格式应与示例一致。
- 确保文件包含以下行:
type: module
- 确保模块名以字母或下划线开头。以下为 PHP 有效函数名规则:
函数名遵循与 PHP 其他标签相同的规则。有效的函数名必须以字母或下划线开头,后接任意数量的字母、数字或下划线。 正则表达式形式为:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*
。
模块显示在 admin/modules 页面,但复选框禁用
- 确保核心兼容性设置为 8.x:
core: 8.x
- 确保模块的所有依赖可用。展开模块信息可查看缺少的依赖。
请注意,部分模块已从 Drupal 8 核心移除,另一些新模块则被加入核心或替换了原有模块。
模块描述为空
记住,description
值用于模块描述。
description: Example Module description.
添加 composer.json 文件
除了在 .info.yml 文件中声明依赖之外,如果模块是 drupal.org 上的贡献模块,并且希望使用 DrupalCI 测试依赖变化,它必须包含 composer.json 文件来声明这些依赖。(DrupalCI 只能检测 composer.json 中的依赖变化,不能检测 .info 或 .info.yml 文件。)