Обновление пакетов на базе modExtra и старые данные

Добрый день!

Столкнулся с такой ситуацией, что реализуя компонент на базе modExtra и обновляя его новыми версиями, у меня не удаляются старые данные (чанки, сниппеты и т.п.) и файлы на сервере. Отсюда возник ряд вопросов, т.к. пока не понятно, возможно у меня косяк в сборщике или так и должно работать. Вообщем, использую modExtra с github.com/bezumkin/modExtra, потихоньку собираю новые версии пакетов, обновляю на сайте.

1. В файле /_build/elements/chunks.php список чанков, которые использует компонент. В процессе работы и обновления версий компонента некоторые чанки были удалены из массива файла /_build/elements/chunks.php. В итоге при установке новой версии компонента на сайте, удаленный из массива файла /_build/elements/chunks.php чанк не удаляется на сайте. В принципе логично, т.к. новая версия не знает об этом чанке и он игнорируется. Правильно ли все работает? Как правильно удалить этот чанк? Через ресолверы? Может есть примеры на GitHub'е?

2. При удалении чанка из массива файла /_build/elements/chunks.php, так же были удалены сами файлы чанков из папки /core/components/[NAME]/elements/chunks/. При установке новой версии компонента на сайте, файлы чанков из папки /core/components/[NAME]/elements/chunks/ не удаляются. В моем случае он стал пустой, т.е. с нулевым размером. Правильно ли все работает? Почему он стал «нулевым», а не проигнорировался? Как правильно удалять файлы чанков, сниппетов и т.п.? Через ресолверы или еще как-то? Может есть примеры на GitHub'е?

3. В одной из версий пакетов использовался процессор /core/components/[NAME]/processors/web/[NAME2]/[NAME3].class.php, но в последующих версиях он был за ненадобностью удален. Но при установке новой версии компонента на сайте, этот файл остался лежать на сервере. В моем случае был один файл процессора в папке web и у меня в проекте он был удален вместе с папкой, а вот на сервере остался и сам файл и папка. Правильно ли все работает? Как правильно удалять файлы из проекта, чтобы при обновлении компонента они удалялись с сервера? Через ресолверы или еще как-то? Может есть примеры на GitHub'е?

4. По пунктам 2 и 3 мне кажется логичным было бы при установке пакета предварительно удалять все файлы компонента из CMS и записывать туда новые. В таком случае не было бы проблемы с файлами от старых версий компонента. Возможно я ошибаюсь и при таком подходе будут другие проблемы. Я так понимаю, что на текущий момент при установке новой версии компонента перезаписываются те файлы, которые есть в проекте. А те которые были удалены, просто игнорируются. Правильно или я ошибаюсь? Необходимо понимать, т.к. в новых версия могу добавить новые версии JS библиотек, у которых будут другие названия файлов, или просто картинки и т.п. Т.е. необходимо ли отслеживать при каждом выпуске новой версии удаленные (могут быть переименованы) файлы? И как правильно их удалять?
Sphinx
13 февраля 2020, 12:19
modx.pro
1
478
0

Комментарии: 3

Артем
14 февраля 2020, 01:58
1
+1
Все правильно, уже имеющиеся данные сборщиком не удаляются, это нужно делать самостоятельно. Для удаления сущностей я написал такой метод:
/**
 * Remove objects
 */
protected function remove()
{
    /** @noinspection PhpIncludeInspection */
    $removed = include($this->config['elements'] . 'remove.php');
    if (!is_array($removed)) {
        $this->modx->log(modX::LOG_LEVEL_ERROR, 'Invalid structure detected on \'Remove\' source');

        return;
    }

    $count = 0;
    foreach ($removed as $className => $conditions) {
        /** @var xPDOIterator $objects */
        if ($objects = $this->modx->getIterator($className, $conditions)) {
            /** @var xPDOObject $object */
            foreach ($objects as $object) {
                $count += (int) $object->remove();
            }
        }
    }
    $this->modx->log(modX::LOG_LEVEL_INFO, $count . ' items have been removed');
}
Соответственно, в папку elements добавляется новый файлик — remove.php, где указываются класс сущности в качестве ключа и условия в качестве значения.
return [
    'modResource' => ['id' => 1],
    'modTemplate' => ['id' => 1],
];
Естественно, с этим файликом нужно быть аккуратным и понимать, что указывать, а также не забывать его очищать для новых проектов.

Для удаления файлов обычно хватает синхронизации в IDE, которая показывает расхождения между удаленным и локальным серверами.
    Николай
    14 февраля 2020, 02:19
    0
    Я думаю «правильных» вариантов нет, всё зависит от программиста. Можно тупо чистить всю папку компонента, и при каждой новой установке заново её генерить. Кроме ресолверов есть ещё и валидаторы, работают также, но ДО установки какой-то сущности (объекта БД, или файлов) из пакета. Можно реализовать самую разную логику работы установщика, по разному запаковать данные. modExtra не панацея на все случаи жизни. Можно доработать modExtra, а можно и вообще свой сборщик сделать, под задачу. Теория работы пакетов достаточно подробно изложена в документации.
      Sphinx
      14 февраля 2020, 10:12
      0
      Все понятно, спасибо за пояснения.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        3