Как опубликовать в нескольких репозиториях в SBT?

Я нахожусь в процессе обновления версии Nexus. В рамках этого процесса я установил новый экземпляр Nexus, который будет работать параллельно со старым экземпляром Nexus.

При переходе на новый экземпляр я хочу тщательно протестировать и проверить новый экземпляр перед тем, как подключить более старый экземпляр. Это требует от меня временно изменить publish рабочий процесс таким образом, что sbt публикует артефакты в обоих экземплярах Nexus.

Я очень сомневаюсь, что следующий код на самом деле будет работать:

    publishTo <<= (version) {
       version: String =>
       if (version.trim.endsWith("SNAPSHOT")) Some("snapshots" at "http://maven1.dev.net:8081/nexus/content/" + "repositories/snapshots/")
       else Some("releases" at "http://maven1.dev.net:8081/nexus/content/" + "repositories/releases/")
    },
    credentials += Credentials("Sonatype Nexus Repository Manager", "maven1.dev.net", "release-eng", "release"),

    publishTo <<= (version) {
       version: String =>
       if (version.trim.endsWith("SNAPSHOT")) Some("snapshots" at "http://maven2.dev.net:8081/nexus/content/" + "repositories/snapshots/")
       else Some("releases" at "http://maven2.dev.net:8081/nexus/content/" + "repositories/releases/")
    },
    credentials += Credentials("Sonatype Nexus Repository Manager", "maven2.dev.net", "release-eng", "release"),

Я также попытался найти плагин под названием sbt-multi-publish, но я также не смог скомпилировать и использовать его.

2 ответа

С помощью команд и как изменить настройку версии внутри одной команды sbt? Я мог бы определить новую команду - myPublishTo - что меняется publishTo установка перед выполнением оригинала publish задача:

def myPublishTo = Command.command("myPublishTo") { state =>
  val extracted = Project.extract(state)
  Project.runTask(
    publish in Compile,
    extracted.append(List(publishTo := Some(Resolver.file("file", target.value / "xxx"))), state),
    true
  )
  Project.runTask(
    publish in Compile,
    extracted.append(List(publishTo := Some(Resolver.file("file", target.value / "yyy"))), state),
    true
  )
  state
}

commands += myPublishTo

С этим выполнить myPublishTo как любая другая команда / задача.

Вы также можете определить пару aliases - pxxx, pyyy а также pxy - в build.sbt что бы выполнить ряд команд, используя ;,

addCommandAlias("pxxx", "; set publishTo := Some(Resolver.file(\"file\", target.value / \"xxx\")) ; publish") ++
addCommandAlias("pyyy", "; set publishTo := Some(Resolver.file(\"file\", target.value / \"yyy\")) ; publish") ++
addCommandAlias("pxy", "; pxxx ; pyyy")

В консоли sbt вы можете выполнять их как любые другие команды / задачи.

[sbt-0-13-1]> alias
    pxxx = ; set publishTo := Some(Resolver.file("file", target.value / "xxx")) ; publish
    pyyy = ; set publishTo := Some(Resolver.file("file", target.value / "yyy")) ; publish
    pxy = ; pxxx ; pyyy
[sbt-0-13-1]> pxy
[info] Defining *:publishTo
[info] The new value will be used by *:otherResolvers, *:publishConfiguration
[info] Reapplying settings...
[info] Set current project to sbt-0-13-1 (in build file:/Users/jacek/sandbox/so/sbt-0.13.1/)
...
[info]  published sbt-0-13-1_2.10 to /Users/jacek/sandbox/so/sbt-0.13.1/target/xxx/default/sbt-0-13-1_2.10/0.1-SNAPSHOT/sbt-0-13-1_2.10-0.1-SNAPSHOT-javadoc.jar
[success] Total time: 1 s, completed Jan 9, 2014 11:20:48 PM
[info] Defining *:publishTo
[info] The new value will be used by *:otherResolvers, *:publishConfiguration
[info] Reapplying settings...
...
[info]  published sbt-0-13-1_2.10 to /Users/jacek/sandbox/so/sbt-0.13.1/target/yyy/default/sbt-0-13-1_2.10/0.1-SNAPSHOT/sbt-0-13-1_2.10-0.1-SNAPSHOT-javadoc.jar
[success] Total time: 0 s, completed Jan 9, 2014 11:20:49 PM

Это старый вопрос, но проблема сохраняется. Я пытался восстановить sbt-multi-publish, но он действительно старый (sbt-0.12) и использует некоторые внутренние компоненты sbt, с которыми трудно иметь дело. Поэтому я выбрал другой подход и написал новый плагин: sbt-publish-more.
Он не требует изменения настроек "на лету" или пользовательских команд, как другой ответ.

После того, как вы добавите плагин, просто установите средства распознавания, которые вы хотите опубликовать (на примере кода):

publishResolvers := {
  val suffix = if (isSnapshot.value) "shapshots" else "releases"
  Seq(
    s"Maven1 ${suffix}" at s"http://maven1.dev.net:8081/nexus/content/repositories/${suffix}/",
    s"Maven2 ${suffix}" at s"http://maven2.dev.net:8081/nexus/content/repositories/${suffix}/"
  )
} 

И позвонить publishAll Задача, он будет публиковать в обоих хранилищах. Вы также можете публиковать в разных репозиториях с различными конфигурациями. Проверьте использование документов для деталей.

Другие вопросы по тегам