编写更新(又名迁移)

有时,当Matomo发布新版本时,有必要对数据库或文件系统进行更改。Matomo通过个人的自动更新过程来实现这一点更新类,其中包含将Matomo从一个版本升级到另一个版本的逻辑。(在其他框架和库中,这些被称为“迁移”。)

本文档解释了如何在Matomo核心和插件中创建更新。

创建新的更新

核心更新存储在核心/更新目录中。文件名应该与更新升级到的版本匹配,例如,4.0.1-b1.php.在内部,类名应该用下划线替换非字母数字字符:Updates_4_0_1_b1

Update类的基本结构是:

<?php类Updates_4_3_0_b3扩展PiwikUpdates {/** * @var MigrationFactory */ private $migration;公共函数__construct(MigrationFactory $factory) {$this->migration = $factory;}公共函数getMigrations(Updater $ Updater){//许多不同的迁移可通过$this->迁移工厂$migration1 = $this->迁移->db->changeColumnType('log_visit', 'example', 'BOOLEAN NOT NULL');//您也可以定义自定义SQL迁移。如果需要绑定参数,请使用' ->boundSql() ' $migration2 = $this->migration->db->sql($sqlQuery = 'SELECT 1');返回数组(// $migration1, // $migration2);}公共函数doUpdate(Updater $ Updater) {$ Updater -> executemig(__FILE__, $this->getMigrations($ Updater));}}

getMigrations ()方法返回要对系统进行的显式逐级更改。这样将它们分开允许我们显示将对用户进行的更改列表,以防用户希望手动执行这些更改,一次执行一个(对于大型实例很有用)。

在此方法中,您可以使用MigrationFactory类的构造函数中设置更新)来创建应该在此中运行的单个迁移的列表更新.Matomo船一套预定义的迁移用于常见的事情,如更改INI配置值,删除或激活插件,创建数据库表或更改数据库表列。在PHP文档中阅读更多关于各个工厂类的信息:

doUpdate ()方法执行整个更新。它必须呼叫更新- > executeMigrations(…)如上所述,如果定义了单独的迁移。它还可以包括其他没有关联迁移的更新逻辑,但鼓励找到某种方法将它们放入迁移中,否则用户将无法手动应用它们。

如果您确实创建了一个自定义迁移,那么您必须进行它幂等.也就是说,多次运行更新应该只更改系统一次,并且不应该导致错误。

创建一个新的Update的步骤

要创建一个新的Update类,请执行以下操作:

  1. 检查core/ version .php中的版本,并碰撞它。如果设置为4.0.0,例如设置为4.0.0-b1.如果设置为4.0.0-b1,设置为4.0.0-b2.如果设置为4.0.0-rc1,设置为4.0.0-rc2.因为产品所有者是唯一一个发布全新版本的人,所以您所使用的版本必须始终是测试版或发布候选版本。
  2. 运行。/控制台生成:更新命令并指定核心
  3. 核心/更新文件夹里现在会有一个新的更新,更新的版本是你把version .php撞到的版本。用您需要的更新逻辑填充它。

如何运行更新

在每个请求Matomo将检查当前版本的Matomo(存储在version_core选项)小于在version .php中硬编码的版本。如果这是真的,那么更新的是代码,而不是数据库。这将触发数据库更新工作流。

对象中的每个更新文件都会被更新工作流查找更新该文件夹的版本大于当前版本,且小于或等于version .php中的版本version_compare ()).它按顺序运行,一个接一个。一旦完成,version_core选项更新。

如果跟踪维度的定义发生变化,更新程序也会自动对跟踪维度进行更改。

合并更新

有时,在pull请求准备好合并之前可能需要一段时间。有可能在此期间合并了其他带有更新的pull请求,每次都会碰撞版本。因此,当原始的pull请求准备合并时,版本碰撞可能不再是新的版本。

由于每次更新都需要更改Version.php文件,这将导致在github中可见的合并冲突。要解决这个问题,只需将version .php和您添加的新更新文件中的版本更改为新的下一个版本。

与迁移模式的差异

如果您了解迁移模式,其中一些可能听起来很熟悉。如果是这样,你也会注意到一些关键的区别:

  • 迁移被绑定到特定的Matomo版本。这意味着每次需要创建更新时,版本都必须碰撞。实际上,这并不是问题,因为我们会发布测试版和候选版本,但这可能会很烦人。
  • 没有办法降级更新。这意味着Matomo降级必须手动完成。这也意味着任何地方都没有描述降级的逻辑。

插件更新

插件也可以包含它们自己的更新。核心更新之间唯一真正的区别是插件更新放在哪里。插件更新放在插件/ {PluginName} /更新文件夹,并可以通过生成:更新命令。

在为插件创建更新的工作流中,唯一的另一个区别是插件版本存储在哪里plugin.json文件。

维度列管理

维度列类型在单个维度类型本身中定义,例如:https://github.com/matomo-org/matomo/blob/4.x-dev/plugins/DevicesDetection/Columns/DeviceBrand.php#L21

日志表中维度列的创建和更新由更新程序自动处理。创建列时,在选项表的名称version_log_table.dimension_column_name对于将值设置为列类型的列,这是我们如何判断是否需要更改它的方法。

属性中的列类型,则该列已具有版本选项该表与维度PHP文件不同,我们知道我们需要更新它。

Baidu