我们正在使用Magento 设置脚本 位于SQL和数据目录中,以传播对所有工作副本和环境的数据更改。这包括配置设置,创建新表格,属性等。

更新 特定于项目的代码 分几个 client_module 扩展。

但是,我们经常需要添加数据迁移(即设置脚本),这不能归因于现有扩展。因此我们使用 Company_client模块 (或client_general,这样的更改)。

想象 多个开发人员 同时在同一项目上工作。开发人员A和开发人员B可能会碰到Company_client的版本数并创建一个新的升级脚本。即使您经常更新工作副本,您也会得到 冲突 比您喜欢的更多,必须更改本地Company_client扩展名的版本,并确保同事的脚本在您进行更改时运行。

我头顶的三个解决方案:

  1. 为项目特定的零件创建许多扩展(污染具有许多不必要的扩展名的代码池)。
  2. 为升级脚本创建一个扩展程序(可能有效,但没有意义)。
  3. 咬着子弹,并手动执行我以前解释的这种冲突结果。

您如何处理?

有帮助吗?

解决方案

我相信找到了满足我需求的解决方案。

我的 先决条件:

  • 仅对所有不适合任何其他扩展的小数据 /结构迁移使用一个扩展名
  • 使多个开发人员能够创建设置脚本而无需发生冲突,因为版本号

我解决方案的第一部分:使用 多个设置脚本资源 在一个扩展中。这很容易 config.xml):

<?xml version="1.0"?>
<config>
    <!-- Your other config stuff... ->
    <global>
        <!-- Your other config stuff... ->
        <resources>
            <[your_setup_name_1]>
                <setup>
                    <module>[Your_Extension]</module>
                </setup>
            </[your_setup_name_1]>
            <[your_setup_name_2]>
                <setup>
                    <module>[Your_Extension]</module>
                </setup>
            </[your_setup_name_2]>
        </resources>
    </global>
</config>

您将面临的问题是,您所有的设置资源都将在数据库表中具有相同的版本编号 core_resource (这是您在您的中指定的版本号 modules 节点)。您不希望这样做,因为它会再次为开发人员造成问题和冲突。

输入我的解决方案的第二部分: 自定义资源设置类 有微小的变化。通过修改每种方法中的一行 applyDataUpdates()applyUpdates() 您可以告诉Magento从另一个XML节点读取版本号。

代替

$configVer = (string)$this->_moduleConfig->version;

$configVer = (string)$this->_resourceConfig->setup->version;

现在,您可以为每个设置资源指定不同的版本号:

<?xml version="1.0"?>
<config>
    <!-- Your other config stuff... ->
    <global>
        <!-- Your other config stuff... ->
        <resources>
            <[your_setup_name_1]>
                <setup>
                    <module>[Your_Extension]</module>
                    <class>Emzee_MultipleSetupVersions_Model_Resource_Setup</class>
                    <version>0.0.3</version>
                </setup>
            </[your_setup_name_1]>
            <[your_setup_name_2]>
                <setup>
                    <module>[Your_Extension]</module>
                    <class>Emzee_MultipleSetupVersions_Model_Resource_Setup</class>
                    <version>0.0.2</version>
                </setup>
            </[your_setup_name_2]>
        </resources>
    </global>
</config>

设置脚本将独立执行,并将通讯版本编号写入 core_resource. 。其他一切都应该一如既往地工作。

现在你只需要 决定您的策略 如何将资源拆分(每个实体,每个开发人员...)。

您可以查看概念扩展的证明 github.

其他提示

从上面的Company_client命名约定中,听起来您只需为每个客户端留下一个特定于项目的模块的范围,该模块迫使多个开发人员在同一模块中工作,同时可能会开发完全不同的功能。

为什么不使用client_module设置,其中模块描述了要创建的模块的目的?过去,这种方法对我来说很好,也可以确保您没有开发一个单一的,肿的模块,可以做各种不同的事情。

有时我知道您需要进行微小的更改,这些更改实际上不保证自己的模块,在这种情况下,我倾向于在所有客户端中使用一个具有相同模块名称的模块,但是客户端显然会更改 - 我已经在客户端_OVERRIDE上解决了这些模块。种类的变化。

您总是会不时遇到冲突的代码,但是在存储库中执行适当的工作流程,良好的模块命名和智能使用分支可以将其降至最低。

我正在开发一个名为“ Mageloshy”的扩展程序,目的是解决保持同步不同环境的问题:

https://github.com/pug-more/magepoyplay

即使我已经在几个具有一些好处的项目中使用了它,它仍然必须扩展,记录良好和全面测试。

它是开源的,任何帮助或建议都将不胜感激。

问候

许可以下: CC-BY-SA归因
scroll top