Обновление пакетов на базе 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 библиотек, у которых будут другие названия файлов, или просто картинки и т.п. Т.е. необходимо ли отслеживать при каждом выпуске новой версии удаленные (могут быть переименованы) файлы? И как правильно их удалять?
Столкнулся с такой ситуацией, что реализуя компонент на базе 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 библиотек, у которых будут другие названия файлов, или просто картинки и т.п. Т.е. необходимо ли отслеживать при каждом выпуске новой версии удаленные (могут быть переименованы) файлы? И как правильно их удалять?
Комментарии: 3
Все правильно, уже имеющиеся данные сборщиком не удаляются, это нужно делать самостоятельно. Для удаления сущностей я написал такой метод:
Для удаления файлов обычно хватает синхронизации в IDE, которая показывает расхождения между удаленным и локальным серверами.
/**
* 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, которая показывает расхождения между удаленным и локальным серверами.
Я думаю «правильных» вариантов нет, всё зависит от программиста. Можно тупо чистить всю папку компонента, и при каждой новой установке заново её генерить. Кроме ресолверов есть ещё и валидаторы, работают также, но ДО установки какой-то сущности (объекта БД, или файлов) из пакета. Можно реализовать самую разную логику работы установщика, по разному запаковать данные. modExtra не панацея на все случаи жизни. Можно доработать modExtra, а можно и вообще свой сборщик сделать, под задачу. Теория работы пакетов достаточно подробно изложена в документации.
Все понятно, спасибо за пояснения.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.