Обновление проекта, расширяющего класс, удаленный в проекте зависимостей
Представь, что у тебя есть посылка MyPackage
и это зависит от другого проекта под названием Library
, MyPackage
имеет методы расширения в классе LibraryClass
который находится в Library
проект.
В какой-то момент Library
изменен и LibraryClass
переименован в NewLibraryClass
или полностью удален Вы вносите изменения в свой проект, например, перемещаете методы расширения в NewLibraryClass
или решить это по-другому, это не имеет большого значения.
Проблема возникает, когда кто-тоLibrary
версия MyPackage
уже установлен и обновляет его. затем Library
Сначала загружается пакет, так как от него зависит ваш проект. В то время как Library
загружается LibraryClass
удаляется и так MyPackage
методы расширения, которые присутствовали в LibraryClass
удалены. Это знаменует MyPackage
как грязный, и поэтому, когда он, наконец, загружает изменения в MyPackage
пользователя просят разрешить слияние, даже если нет реальных конфликтов.
Как это можно решить? Потому что, в конце концов, ваш код в порядке, но пользователь, который обновляет ваш проект, столкнется со странными вопросами слияния.
1 ответ
У меня есть взлом, который не должен квалифицироваться как полное решение, но помогает преодолеть проблему.
В конфигурации вашего проекта добавьте do- pre-load doit (раздел 1.10 " Управление проектами с помощью Metacello") и вызовите этот метод:
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
не будет иметь никаких методов расширения MyPackage