【问题标题】:Updating project that extends a class removed in dependency project更新扩展依赖项目中删除的类的项目
【发布时间】:2015-11-23 15:06:44
【问题描述】:

假设您有一个包MyPackage,它依赖于另一个名为Library 的项目。 MyPackageLibraryClass 类中具有扩展方法,该类位于 Library 项目中。

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

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

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

【问题讨论】:

  • 我认为正确处理此问题的唯一方法是让每个项目跟踪(即记住)名称已更改的所有类,并提供依赖项目在加载时可以用来迁移自身的服务.

标签: dependency-management pharo monticello metacello


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-10
    • 2012-06-08
    • 1970-01-01
    • 2020-05-29
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多