避免在设置脚本中与多个开发人员发生冲突
-
16-10-2019 - |
题
我们正在使用Magento 设置脚本 位于SQL和数据目录中,以传播对所有工作副本和环境的数据更改。这包括配置设置,创建新表格,属性等。
更新 特定于项目的代码 分几个 client_module 扩展。
但是,我们经常需要添加数据迁移(即设置脚本),这不能归因于现有扩展。因此我们使用 Company_client模块 (或client_general,这样的更改)。
想象 多个开发人员 同时在同一项目上工作。开发人员A和开发人员B可能会碰到Company_client的版本数并创建一个新的升级脚本。即使您经常更新工作副本,您也会得到 冲突 比您喜欢的更多,必须更改本地Company_client扩展名的版本,并确保同事的脚本在您进行更改时运行。
我头顶的三个解决方案:
- 为项目特定的零件创建许多扩展(污染具有许多不必要的扩展名的代码池)。
- 为升级脚本创建一个扩展程序(可能有效,但没有意义)。
- 咬着子弹,并手动执行我以前解释的这种冲突结果。
您如何处理?
解决方案
我相信找到了满足我需求的解决方案。
我的 先决条件:
- 仅对所有不适合任何其他扩展的小数据 /结构迁移使用一个扩展名
- 使多个开发人员能够创建设置脚本而无需发生冲突,因为版本号
我解决方案的第一部分:使用 多个设置脚本资源 在一个扩展中。这很容易 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
即使我已经在几个具有一些好处的项目中使用了它,它仍然必须扩展,记录良好和全面测试。
它是开源的,任何帮助或建议都将不胜感激。
问候