Как публиковать в нескольких хранилищах в 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, но я не смог его скомпилировать и использовать.
Ответы
Ответ 1
С Commands и Как изменить параметр версии внутри одной команды 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
как любую другую команду/задачу.
Вы также можете определить пару alias
es - pxxx
, pyyy
и pxy
- in 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
Ответ 2
Это старый вопрос, но проблема сохраняется. Я попытался оживить 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
, она опубликует в оба репозитория.
Вы также можете публиковать в разных хранилищах с различными конфигурациями. Подробнее см. документы об использовании.