0

想象一下,你有一个包MyPackage,它依赖于另一个名为Library. 在项目MyPackage中的类中具有扩展方法。LibraryClassLibrary

在某些时候Library被更改并被LibraryClass重命名NewLibraryClass或完全删除。您在项目中进行更改,例如将扩展方法移动到NewLibraryClass或以不同的方式解决它,这并不重要。

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

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

4

1 回答 1

0

我有一个不应被称为完整解决方案的 hack,但有助于克服该问题。

在项目的配置中添加一个预加载 doit(使用 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

这将删除 from 的所有扩展协议,MyPackage并将LibraryClass其标记MyPackage为未修改(干净、不脏……)。那么什么时候Library会被加载,什么时候会被移除LibraryClassMyPackage不会被标记为脏的,因为那一刻LibraryClass不会有任何扩展方法MyPackage

于 2015-11-23T15:06:44.463 回答