У меня довольно нормальный Scala project, который в настоящее время строится с использованием Maven. Я хотел бы поддержать как Scala 2.9.x, так и предстоящий 2.10, который не является бинарным или исходным. Я готов принять участие в конвертации в SBT, если это необходимо, но я столкнулся с некоторыми проблемами.
Мои требования для этого проекта:
-
Дерево с одним источником (без ветвления). Я считаю, что попытка поддержки нескольких параллельных "главных" ветвей для каждой версии Scala будет самым быстрым способом пропустить исправления между ветвями.
-
Исходные каталоги, зависящие от версии. Поскольку версии Scala не являются совместимыми с исходными кодами, мне нужно указать каталог вспомогательных источников для источников, зависящих от версии.
-
Конкретные исходные банки. Конечные пользователи должны иметь возможность загружать правильную исходную банку с соответствующими исходными версиями для своей версии Scala для интеграции IDE.
-
Интегрированное развертывание. В настоящее время я использую плагин релиза Maven для развертывания новых версий в репозитарии Sonatype OSS и хотел бы иметь аналогичный простой рабочий процесс для выпусков.
-
Поддержка конечных пользователей Maven. Мои конечные пользователи часто являются пользователями Maven, и поэтому функциональный POM, который точно отражает зависимости, является критическим.
-
Поддержка заштрихованной банки. Я должен иметь возможность создавать JAR, который включает подмножество моих зависимостей и удаляет затененные зависимости из опубликованного POM.
Вещи, которые я пробовал:
-
Профили Maven. Я создал набор профилей Maven для управления тем, какая версия Scala используется для сборки, используя плагин Maven build-helper для выбора дерева исходных версий. Это работало хорошо, пока не пришло время публиковать;
-
Использование классификаторов для квалификации версий не работает, потому что исходным банкам также нужны специальные классификаторы ( "источник-2.9.2" и т.д.), и большинство инструментов IDE не будут знать, как найти их.
-
Я попытался использовать свойство Maven, чтобы добавить суффикс _ ${ scala.version} SBT в имя артефакта, но Maven не любит свойства в имени артефакта.
-
- SBT
. Это хорошо работает, как только вы можете это понять (небольшая задача, несмотря на обширную документацию). Недостатком является то, что, похоже, не похоже на плагин Maven shadow. Я посмотрел:
-
Proguard. Плагин не обновляется для SBT 0.12.x и не будет строиться из источника, потому что он зависит от другого плагина SBT, который изменил groupIds, и не имеет версии 0.12.x под старым именем. Мне еще не удалось выяснить, как проинструктировать SBT игнорировать/заменять зависимость плагина.
-
OneJar. Это использует пользовательскую загрузку классов для запуска основных классов из встроенных банок, что не является желаемым результатом; Я хочу, чтобы файлы классов моего проекта были в банке вместе с (возможно, переименованными) файлами классов из моих затененных зависимостей.
-
Плагин сборки SBT. Это может работать в определенной степени, но в файле POM отображаются зависимости, которые я пытаюсь затенять, что не помогает моим конечным пользователям.
-
Я согласен с тем, что не может быть решения, которое делает то, что я хочу для Scala, и/или мне может понадобиться написать мои собственные Maven или плагины w60 для достижения цели. Но если я могу найти существующее решение.
Update
Я близок к тому, чтобы принять @Jon-Ander отличный ответ, но для меня есть еще одна выдающаяся штука, которая является единым процессом выпуска. Текущее состояние моего build.sbt находится в GitHub. (Я воспроизведу его здесь в ответ позже для потомков).
Плагин sbt-release не поддерживает сборку с несколькими версиями (т.е. + release
не ведет себя так, как хотелось бы), что делает определенный смысл, поскольку процесс тегирования релиза действительно не обязательно версии. Но я хотел бы, чтобы две части процесса были мульти-версией: тестирование и публикация.
То, что я хотел бы иметь, это нечто похожее на двухэтапный процесс maven-release-плагина. На первом этапе будет выполняться административная работа по обновлению Git и запуску тестов, что в данном случае означает запуск + test
, чтобы все версии были протестированы, помечены, обновлены до моментального снимка, а затем нажали результат вверх по течению.
Второй этап будет проверять тегированную версию и + publish
, которая перезапустит тесты и выведет тегированные версии в репозиторий Sonatype.
Я подозреваю, что могу написать releaseProcess
значения, которые делают каждый из них, но я не уверен, могу ли я поддерживать несколько значений releaseProcess
в моем build.sbt
. Вероятно, он может работать с некоторыми дополнительными областями, но эта часть SBT по-прежнему остается странной для меня.
В настоящее время я изменил releaseProcess
, чтобы не публиковать. Затем мне нужно проверить версию с меткой вручную и запустить + publish
после того, как факт, близкий к тому, что я хочу, но выполняю компромисс, тем более, что тесты выполняются только в текущей версии Scala в процессе выпуска. Я мог бы жить с процессом, который не является двухступенчатым, как плагин maven, но реализует проверку и публикацию нескольких версий.
Любая дополнительная обратная связь, которая может получить меня через последнюю милю, будет оценена.