Предположим, что я пишу библиотеку Scala L, которая зависит от некоторой зависимости D и потребляется программой P и другой программой Q. P зависит от версии 3.2 от D напрямую, а Q зависит от версии 3.3 напрямую.Как я могу использовать SBT, чтобы помочь моей библиотеке преодолеть конфликты транзитивной зависимости
Между этими двумя версиями API D's был перетасован таким образом, что для получения той же функции, которую я использую в L, я должен писать различные операторы импорта в L. Аналогично, P полагается на 3.2-специфическое поведение, тогда как Q полагается на поведение 3.3.
Теперь, как правило, произойдет то, что самая последняя версия D будет выбрана при компиляции P и Q, но это приведет к разрыву P, если L зависит от версии 3.3 библиотеки или L для разрыва при компиляции Q, если L зависит от версии 3.2 D. D.
Я бы идеально хотел, чтобы одна и та же версия L использовалась как P, так и Q, поскольку открытый API L не изменяется. Это возможно?
Общий метод, который приходит на ум, является условной компиляцией L на основе разрешения зависимостей. Это кажется недостижимым, хотя в мире JVM, поскольку мы не транзитивно компилируем зависимости проекта и вместо этого полагаемся на предварительно скомпилированные артефакты.
Я могу сделать это прямо сейчас с SBT, если D - сама Scala (т.е. кросс-компиляция с различными версиями Scala и наличие кода конкретной версии в собственных каталогах), но это что-то вроде взлома с точки зрения зависимости поскольку SBT изменяет имена артефактов, чтобы эта кросс-компиляция работала.
Это не проблема, с которой я столкнулся. Чтобы взять ваш пример SLF4J, проблема, с которой я сталкиваюсь, сродни тому, что Slick использовал версию 1.7 SLF4J, но также мог использовать версию 1.6 с небольшими изменениями в своем коде. Приложение с использованием Slick должно использовать версию 1.6 и разрывается на 1.7. Могут ли авторы Slick приспособить этот вариант использования, разрешив, чтобы часть кода адаптера, необходимая для размещения 1.6, была скомпилирована, если присутствует 1.6, и скомпилирован другой фрагмент кода, если присутствует 1.7? – badcook
Для справки, в других языковых экосистемах это часто выполняется с помощью препроцессорных директив, которые приводят к одному пути кода, если определенные зависимости обнаружены, а другое, если обнаружены другие зависимости. – badcook