有时,当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类,请执行以下操作:
4.0.0
,例如设置为4.0.0-b1
.如果设置为4.0.0-b1
,设置为4.0.0-b2
.如果设置为4.0.0-rc1
,设置为4.0.0-rc2
.因为产品所有者是唯一一个发布全新版本的人,所以您所使用的版本必须始终是测试版或发布候选版本。。/控制台生成:更新
命令并指定核心
.核心/更新
文件夹里现在会有一个新的更新,更新的版本是你把version .php撞到的版本。用您需要的更新逻辑填充它。在每个请求Matomo将检查当前版本的Matomo(存储在version_core
选项)小于在version .php中硬编码的版本。如果这是真的,那么更新的是代码,而不是数据库。这将触发数据库更新工作流。
对象中的每个更新文件都会被更新工作流查找更新
该文件夹的版本大于当前版本,且小于或等于version .php中的版本version_compare ()
).它按顺序运行,一个接一个。一旦完成,version_core
选项更新。
如果跟踪维度的定义发生变化,更新程序也会自动对跟踪维度进行更改。
有时,在pull请求准备好合并之前可能需要一段时间。有可能在此期间合并了其他带有更新的pull请求,每次都会碰撞版本。因此,当原始的pull请求准备合并时,版本碰撞可能不再是新的版本。
由于每次更新都需要更改Version.php文件,这将导致在github中可见的合并冲突。要解决这个问题,只需将version .php和您添加的新更新文件中的版本更改为新的下一个版本。
如果您了解迁移模式,其中一些可能听起来很熟悉。如果是这样,你也会注意到一些关键的区别:
插件也可以包含它们自己的更新。核心更新之间唯一真正的区别是插件更新放在哪里。插件更新放在插件/ {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文件不同,我们知道我们需要更新它。