当前位置: 首页 > 面试题库 >

为什么Magento不支持模块的卸载/降级?

储法
2023-03-14
问题内容

自动即时回滚是企业级部署机制的重要功能。目前,无法使用Magento的内置安装工具来实现。

鉴于Magento的core_resource机制允许顺序执行安装脚本以进行模块的安装或升级(通过SQL以及PHP的执行),逻辑上恕我直言,它应该反向支持相同的过程。

现在,一些明显的理由不支持它:

  1. 回滚脚本要独立(并且可能是幂等的)将具有挑战性。我不认为这是避免使用该功能的正当理由,但这充其量只是一个借口。

  2. 其他模块可能依赖于已安装的模块。模块的xml声明<depends/>节点可用于标记这些链接。

  3. 开发人员可能希望暂时禁用模块而不进行完全卸载。这可能需要xml声明<active/>节点中的新状态。

对您的想法感兴趣。
京东


问题答案:

我已经看到一些与此相关的帖子,并亲自调查了相同的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;
}

我还没有机会真正地测试上述内容,而只是从对magento和Autoloading的ORM的初步调查以及其他开发人员对他的发现的投入中得出的结论。

最终,如果我们可以将所有更改至少保留在版本控制的系统中的模块方面,那将是理想的。显然,不应以这种方式管理需要导入的庞大数据集,但对于这些小的增量更改,我想推送至暂存,生产测试,如果失败,则将其拉回一个版本,一切恢复正常。

显然,对于这么多具有​​不同需求的客户端而言,没有一种理想的部署解决方案,但是一种通用的实现方式将有助于代码/
SQL部署。具有讽刺意味的是,Enterprise拥有CMS暂存,并且具有代码模块化开发的能力,但是DB并没有获得如此多的关注。

有一个相关的问题,说明我们目前如何使用一些专门做的“自制”脚本来完成此工作:

进行MySQLDump或备份,然后对SQL文件中的BASE_URLs进行替换。

可以查看的另一种工具是Phing。

如果有人有时间调查 似乎 已实施的“回滚”和“卸载”过程并报告其发现,这对我也将有所帮助。



 类似资料:
  • 本文向大家介绍为什么Java不支持<<相关面试题,主要包含被问及为什么Java不支持<<时的应答技巧和注意事项,需要的朋友参考一下 Java添加了运算符“ >>>”来执行逻辑右移,但是由于 逻辑和算术左移运算是相同的 ,因此Java中没有“ <<<”运算符。 来自Java的Shifts …

  • 问题内容: TL / DR: 更新 我已经就此问题与Python开发人员联系,实际上,“在未来五年内”不可能完全卸载模块。(请参阅链接) 请接受,在2.x中,Python确实不支持针对严重,根本,不可克服的技术问题的卸载模块。 在我最近一次寻找应用程序内存泄漏的过程中,我将其范围缩小到模块,即我无法 垃圾收集 已卸载的模块。使用下面列出的 任何 方法卸载模块都会在内存中保留数千个对象。换句话说-我

  • 问题内容: 我很好奇在使用模块后是否有任何好的方法可以卸载模块。在某些情况下,我需要使用引入大量代码的模块,但是很少使用它们(例如作为管理工具),但是我犹豫使用它们,因为在此之后它们可能只会浪费内存,这可能会更好在其他地方使用。是否有任何方法可以卸载它们,无论是显式卸载还是在一段时间不使用它们时允许系统卸载它们? 问题答案: 是的,可以直接访问模块缓存: 请注意,如果您的代码中包含对您想摆脱的这些

  • 我注意到一件奇怪的事情,显然Firefox说它支持HTTPS上的Brotli,但不支持HTTP?Brotli与gzip类似,但效率更高,为什么它会将其限制为HTTPS?在HTTPS选项卡上,我看到: 他被派去了。但在另一个网站上,我没有看到。为什么它不能做Brotli压缩HTTP?

  • 问题内容: Java为什么不包括对无符号整数的支持? 在我看来,这是一个奇怪的遗漏,因为它们允许人们编写不太可能在意外大的输入上产生溢出的代码。 此外,使用无符号整数可以是一种自我证明的形式,因为它们指示无符号int打算保留的值永远不会为负。 最后,在某些情况下,无符号整数对于某些操作(例如除法)可能更有效。 包括这些的不利之处是什么? 问题答案: 在两行之间阅读时,我认为逻辑是这样的: 通常,J

  • 我用的是IntelliJ IDEA Pro 13.1.2。从未使用过13以下的任何版本。 当试图从IDE运行时,我得到以下消息: