更新扩展在依赖项目

时间:2015-11-23 15:06:44

标签: dependency-management pharo monticello metacello

想象一下,你有一个包MyPackage,它取决于另一个名为Library的项目。 MyPackageLibraryClass项目中的Library类中有扩展方法。

某些时候Library已更改,LibraryClass已重命名为NewLibraryClass或已完全删除。您在项目中进行了更改,例如将扩展方法移至NewLibraryClass或以不同方式解决,这无关紧要。

当有人预先安装了Library - 更改版MyPackage并更新后,就会出现问题。然后首先加载Library包,因为您的项目依赖于它。加载LibraryLibraryClass已被删除,因此MyPackage中存在的LibraryClass扩展方法将被删除。这会将MyPackage标记为脏,因此当它最终将更改加载到MyPackage时,即使没有真正的冲突,也会要求用户解析合并。

如何解决这个问题?因为最终您的代码很好,但更新项目的用户将面临奇怪的合并问题。

1 个答案:

答案 0 :(得分:0)

我有一个不应被视为完整解决方案的黑客,但有助于克服这个问题。

在项目配置中添加预加载doit(Managing projects with Metacello的第1.10节)并调用此方法:

cleanUpLibrary

  | myPackage |

  myPackage := (#MyPackage asPackageIfAbsent: [ ^ self ]).

  LibraryClass asClassIfPresent: [ :class |
    class protocols
      select: [ :prot | prot asLowercase beginsWith: myPackage methodCategoryPrefix ]
      thenDo: [ :prot | class removeProtocol: prot ] ].

  myPackage mcWorkingCopy modified: false

这将从MyPackage删除LibraryClass的所有扩展协议,并将MyPackage标记为未修改(干净,不脏...)。然后,当Library将加载并删除LibraryClass时,MyPackage将不会被标记为脏,因为此时LibraryClass将不会有{{1}的任何扩展方法}}