SBT зависит от конкретной версии снимка
У меня есть artifactory с несколькими версиями моментальных снимков, например artifact-0.1-20120831.103456-5
.
Мой проект зависит от конкретной версии моментального снимка.
Если я скажу SBT, чтобы загрузить версию 0.1-20120831.103456-5
вместо 0.1-SNAPSHOT
, она не справляется с задачей обновления.
// build.sbt
libraryDependencies ++= Seq(
"com.example" % "smith" % "0.1-20120906.110133-36")
// sbt update
[warn] ==== My Repo snapshots: tried
[warn] http://repo.localhost/snapshots/com/example/smith/0.1-20120906.110133-36/commons-0.1-20120906.110133-36.pom
Как сделать артефакты поиска SBT в каталоге http://repo.localhost/snapshots/com/example/smith/0.1-SNAPSHOT, но использовать уникальную версию моментального снимка?
Ответы
Ответ 1
Дополнение Помимо плагина с уникальной версией, sbt также имеет плагин ethernet-развертывания (см. ниже).
Существует уникальный плагин версии, который позволяет вам разрешать ваши артефакты, как вы хотите. Цитата со страницы:
Как указать на это
"0.1.0" or "0.1.0-20120602-073010" you can always use the static version number.
"0.1.0-+" selects the latest 0.1.0 snapshot.
"latest.integration" selects the latest revision regardless of its status.
"latest.milestone" selects the latest revision with either Milestone or Release status.
"latest.release" selects the latest with the Release status.
Но вы также должны публиковать этот плагин, так как артефакты публикуются по-разному относительно версии: в вашем примере артефакт не будет храниться в каталоге 0.1-SNAPSHOT, но под 0.1-20120831.103456-5
Добавление
Существует также плагин aether-deploy, в котором используется Aether (Aether предлагает стандартный способ взаимодействия с репозиториями Maven). Проблема в том, что этот плагин в настоящее время работает только для развертывания (как предполагает название плагина). Возможно, у автора есть планы продлить его так, чтобы он работал для разрешения (звучит как полезная функция для меня). Если вы не можете публиковать с помощью уникального плагина версии (например, если снимки не принадлежат вам), вы можете спросить, что на sbt forum.
Поэтому я не могу предложить решение, которое работает точно так же, как и maven для вашего варианта использования, но, надеюсь, оно дает некоторую полезную информацию для вас и других.
Ответ 2
Уродливым обходным решением было бы установить артефакт моментальных снимков в вашей собственной группеId (скажем smith.external) НЕ как SNAPSHOT, используя install: instal-file
и объявить номер нужной версии вместо объявления использования моментального снимка.
Как вы не ожидаете, что версия изменится, вы можете положиться на это, пока не получите ее для работы с предоставленной стабильной версией (и регулярной группой)
Ответ 3
Не лучшее решение, но вы можете попытаться использовать менеджеров конфликтов, предоставленных Ivy (см. документы apache). Например, по умолчанию используется "последняя ревизия", а менеджер "последней совместимости" должен отклонять любые конфликты зависимостей.
Невозможно настроить, но кто-то в группе google sbt опубликовал следующее правило:
def addConflictManager(org: String, name: String, conflictManager: String) =
ivyModule <<= (ivyModule, streams) map { (module, s) =>
module.withModule(s.log) { (ivy, desc, _) =>
import _root_.org.apache.ivy.{core, plugins}
import core.module.id.ModuleId
import plugins.matcher.PatternMatcher
desc.addConflictManager(
ModuleId.newInstance(org, name),
ivy.getSettings.getMatcher(PatternMatcher.EXACT),
ivy.getSettings.getConflictManager("latest-compatible"))
module
}
}