есть ли причина, по которой Magento не поддерживает деинсталляцию / понижение версии для модулей - PullRequest
2 голосов
/ 14 марта 2011

Автоматический мгновенный откат - важная особенность механизмов развертывания корпоративного уровня.В настоящее время невозможно достичь этого, используя встроенные инструменты установки Magento.

Учитывая, что механизм Magento core_resource допускает последовательное выполнение сценариев установки для установки или обновления модулей (посредством выполнения SQL, а также PHP), кажется логичным ИМХО, что он должен поддерживать тот же процесс в обратном порядке.,

Теперь несколько очевидных причин не поддерживать его:

  1. Было бы сложно обеспечить независимость сценариев отката (и, возможно, идемпотентности?).Я не вижу в этом веской причины избегать этой функции, в лучшем случае это оправдание.

  2. Другие модули могут зависеть от установленного модуля.Узел xml объявление модуля <depends/> может использоваться для пометки этих связей.

  3. Разработчик может захотеть временно отключить модуль без полной деинсталляции.Для этого может потребоваться новый статус в узле xml декларации <active/>.

Интересуют ваши мысли.
JD

Ответы [ 3 ]

3 голосов
/ 14 марта 2011
  1. Мне напомнили о моем собственном вопросе , где Иван Чепурный сказал вам:

    @ Джонатан надеется, что Magento 2.0 будет более дружественным к разработчикам, особенно в плане обновления базы данных. Но, конечно, это будет просто расширение Zend_Db. Использование Doctrine 2.0 orm решит эту проблему, но требует переписать Magento с нуля:)

    Я не знаю Doctrine, но после прочтения его mapping схема описана в комментариях PHPDoc для классов (предположительно, отражающих ), которые затем прозрачно преобразуются в запросы. Нет необходимости в установочных скриптах. Это должно означать, что откат - это то же самое, что и понижение версии, установка классов предыдущей версии и их комментариев, а остальное просто происходит.

    Зная Magento, они, вероятно, не вернутся назад и не расстроят старый код, а вместо этого предложат альтернативный метод установки с использованием инкрементных файлов XML - хотя и без пространства имен. Откат версии здесь означал бы инвертирование разницы, как описано в каждом файле.
    Я бы тоже предпочел этот способ, так как это означает, что такие инструкции, как вставка записей по умолчанию, были бы возможны, но я не думаю, что Doctrine справится. И он сосуществует с версиями, предшествующими изменению. Собираетесь ли вы сделать запрос на добавление ?

  2. Номера версий в <depends/> кажутся логичными.

  3. У меня нет третьего пункта, но я хотел закончить набор. : D

Edit:
Я забыл ответить на вопрос. Нет, нет причины, по которой Magento не должен поддерживать понижения, по крайней мере, если они готовы были приложить усилия.

3 голосов
/ 15 марта 2011

Я видел некоторые сообщения, касающиеся этого, и сам исследовал те же сценарии для развертывания SQL.Я должен согласиться с тем, что для уровня Magento уровня предприятия должна быть встроена такая функциональность.Хорошая новость, по крайней мере в НЕКОТОРЫХ формах или моде, насколько она завершена, я не совсем уверен.Вот пример отката при исключении:

try {
    $write = Mage::getSingleton('core/resource')->getConnection('core_write');
    $write->beginTransaction();

// do stuff here

    $write->commit();
} catch (Exception $e) {
    mage::log(__METHOD__ . ':' . __LINE__ . ': Rollback happened.');
    $write->rollback();
}

Теперь, если вы посмотрите на app / code / core / Mage / Core / Model / Resource / Setup.php, вы найдете немалоинтересные методы.В частности: _getModifySqlFiles, _rollbackResourceDb и _modifyResourceDb.

_modifyResourceDb являются наиболее интересными для меня, так как здесь $ actionType может также выполнять откат и удаление - также обратите внимание, что вы можете использовать PHPтакже файлы для ваших установочных файлов.

// Read resource files
$arrAvailableFiles = array();
$sqlDir = dir($sqlFilesDir);
while (false !== ($sqlFile = $sqlDir->read())) {
    $matches = array();
    if (preg_match('#^'.$resModel.'-'.$actionType.'-(.*)\.(sql|php)$#i', $sqlFile, $matches)) {
        $arrAvailableFiles[$matches[1]] = $sqlFile;
    }
}

После выполнения этого кода:

$arrModifyFiles = $this->_getModifySqlFiles($actionType, $fromVersion, $toVersion, $arrAvailableFiles);

Но здесь я предполагаю, что основные разработчики Magento потерялись в недрах ресурса EAVмодель и просто оставил ее частично завершенной.

protected function _getModifySqlFiles($actionType, $fromVersion, $toVersion, $arrFiles)
{
    $arrRes = array();

    switch ($actionType) {
        case 'install':
        case 'data-install':
...
        case 'rollback':
            break;

        case 'uninstall':
            break;
    }
    return $arrRes;
}

У меня не было возможности действительно проверить вышеупомянутое, но только из моих первоначальных исследований ORM, который является magento и Autoloading, а также другоговклад разработчика на его выводы, а также.

В конечном итоге было бы идеально, если бы мы могли сохранить все наши изменения как минимум в модульной системе контроля версий.Очевидно, что огромные наборы данных, которые необходимо импортировать, не должны управляться таким образом, но для этих небольших постепенных изменений я хочу перейти к промежуточному, производственному тестированию, а в случае неудачи верните его обратно на одну версию, и все вернется в нормальное состояние.

Очевидно, что нет единственного идеального решения для развертывания с таким большим количеством клиентов, имеющих разные требования и потребности, но общий способ сделать это помог бы с развертыванием кода / SQL.Это иронично, что у Enterprise есть этапы CMS и возможность модульной разработки кода, но БД не получила такой большой любви.

Есть связанный вопрос, который говорит о том, как в настоящее время мы делаем это снекоторые специализированные сценарии «домашнего производства», которые по существу делают:

Выполнение MySQLDump или резервного копирования, а затем замена BASE_URL в файле SQL.

Лучшие практики для развертывания Magento

Еще один инструмент, на который стоит обратить внимание: Phing .

Если у кого-то есть время исследовать процессы "отката" и "удаления", которые кажутся , которая будет реализована и сообщать о своих выводах, также будет полезна для меня.

1 голос
/ 14 марта 2011

Примечание: возможно, это не относится к Magento.

Я обычно просматриваю обновления приложений базы данных, охватывающие две основные области: 1. код 2. база данных.

Обновления кода легко откатить,Я обычно управляю этим отдельно от кода обновления / управления приложениями.Я обычно использую файловую систему ОС, чтобы предоставить мне возможность «мгновенного отката».Что касается отката базы данных, все становится сложнее.Можно использовать аналогичный подход с базой данных.Однако это было бы реалистично только в тестовой системе.

Если бы вас интересовал только откат кода, я бы использовал что-то внешнее от самого приложения для управления этим.Полагаю, это можно считать моментальным снимком.

Если Magento не поддерживает это из коробки, я не думаю, что было бы разумно использовать его.Кажется, что это довольно основное требование, которое, если его не планировать и не кодировать с самого начала, будет довольно сложным для реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...