Удаление старых версий пакетов MODX Revolution

MODX и старые версии пакетов

 

При обновлении дополнений MODX всегда оставляет предыдущую версию пакета на случай, если вам придется вернуться к ней по тем или иным причинам. Новый пакет также загружается в папку /core/packages/. Кроме того, в таблицу «modx_transport_packages» добавляется новая запись.

Многие дополнения обновляются достаточно часто, и в указанной папке со временем накапливается значительное количество версий компонентов. Вручную удалять их не следует, записи в таблице останутся по-любому. Но MODX имеет встроенный функционал для корректного удаления устаревших версий.


Избавиться от них несложно. Делается это таким образом: идем в «Приложения – Установщик». У нужного нам дополнения нажимаем на кнопку «Посмотреть детали». В открывшемся окне переходим на вкладку «Загруженная версия». На вкладке отобразится список всех загруженных версий пакета.

 

Удаление старых версий пакетов в MODX Revolution

 

Более старые версии показываются внизу, более новые – выше. Для удаления пакета нажимаем правой кнопкой мыши на нужной строке и выбираем «Удалить версию пакета». Удаляем так все устаревшие версии, причем по порядку, но снизу вверх, начиная с самых старых.

При большом количестве версий дополнений, особенно если самих дополнений много, процесс может показаться затратным по времени. Но выход есть.

 

Консольный скрипт для автоматического удаления от Василия Наумкина

Скрипт следует загрузить в корневую директорию сайта и запустить. Он выберет все установленные версии, кроме последней, и корректно удалит их через родной процессор.

<?php 
define('MODX_API_MODE', true);
require 'index.php';
$modx->getService('error', 'error.modError');
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('ECHO');
if (!XPDO_CLI_MODE) {
    echo '
';
}
$c = $modx->newQuery('transport.modTransportPackage');
$c->select('package_name');
$c->groupby('package_name');
if ($c->prepare() && $c->stmt->execute()) {
    while ($package = $c->stmt->fetchColumn()) {
        $c2 = $modx->newQuery('transport.modTransportPackage', ['package_name' => $package]);
        $c2->where(['installed:!=' => '0000-00-00 00:00:00']);
        $c2->sortby('installed', 'desc');
        $c2->limit(1000, 1);
        $c2->select('signature');
        if ($c2->prepare() && $c2->stmt->execute()) {
            while ($signature = $c2->stmt->fetchColumn()) {
                $res = $modx->runProcessor('workspace/packages/version/remove', ['signature' => $signature]);
                if (!$res->isError()) {
                    echo $signature . " removed!\n";
                    ob_flush();
                } else {
                    $modx->log(modX::LOG_LEVEL_ERROR, "Could not remove {$signature}:" . $res->getMessage());
                }
            }
        }
    }
}
if (!XPDO_CLI_MODE) {
    echo '
'; }

Если вы ранее уже удаляли файлы в core/packages/ вручную, скрипт сгенерирует ошибки. Внимания на это можно не обращать внимание, скрипт все равно в любом случае произведет очистку записей в таблице пакетов.


Удаление пакетов указанными способами производится максимально корректно. Удаляются как сами пакеты, так и записи базы данных.