想象一下,你有一个包MyPackage
,它取决于另一个名为Library
的项目。 MyPackage
在LibraryClass
项目中的Library
类中有扩展方法。
某些时候Library
已更改,LibraryClass
已重命名为NewLibraryClass
或已完全删除。您在项目中进行了更改,例如将扩展方法移至NewLibraryClass
或以不同方式解决,这无关紧要。
当有人预先安装了Library
- 更改版MyPackage
并更新后,就会出现问题。然后首先加载Library
包,因为您的项目依赖于它。加载Library
时LibraryClass
已被删除,因此MyPackage
中存在的LibraryClass
扩展方法将被删除。这会将MyPackage
标记为脏,因此当它最终将更改加载到MyPackage
时,即使没有真正的冲突,也会要求用户解析合并。
如何解决这个问题?因为最终您的代码很好,但更新项目的用户将面临奇怪的合并问题。
答案 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}的任何扩展方法}}