Одна из самых сложных задач каждого менеджера пакетов, которую я видел, - это обработка противоречивых зависимостей.
Позвольте работать со следующим мнимым приложением SwiftApp, которое зависит от некоторых сторонних пакетов.
- SwiftApp - [email protected] - [email protected] - [email protected] - [email protected] - [email protected] - [email protected]
Из приведенного выше графика зависимости мы видим, что обе зависимости SwiftApp используют packageC, но с разными основными идентификаторами версии. Для большинства языковых экосистем это становится проблемой - основная ошибка в версии обычно означает, что были внесены изменения в код, которые не совместимы с предыдущей версией.
В зависимости от технических возможностей языка/компилятора/другого соответствующего компонента менеджер пакетов может быть реализован одним из следующих способов:
- Отказать в установке/компиляции (php, ruby, python?, другие?)
- Не волнует, пусть разработчик имеет дело с потенциальными ошибками компилятора (???)
- Установить пакет C для обоих пакетов независимо (Node.js, другие?)
Третий вариант может быть достигнут только при правильной поддержке языка или самого компилятора.
Может ли этот график зависимостей быть достигнут без разрыва в Swift?
Другими словами, технически ли возможно, чтобы packageA имел (и использовал) версию 1.0.0 пакета C, в то время как у пакета B будет версия 2.0.0?
Учитывая недавнее выражение о том, что Swift теперь является открытым исходным кодом и приходит с собственным менеджером пакетов, я думаю, что этот вопрос может быть очень ценным для будущих читателей, заинтересованных в разработке пакета Swift.