如何在SBT中发布到多个存储库?

时间:2014-01-08 01:45:14

标签: scala 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 个答案:

答案 0 :(得分:3)

使用CommandsHow to change a version setting inside a single sbt command?我可以定义一个新命令 - 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中定义几个pxxx es - pyyypxybuild.sbt,它们将使用{执行一系列命令{1}}。

;

在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")

答案 1 :(得分:0)

这是一个老问题,但问题仍然存在。我试图恢复sbt-multi-publish,但它确实很旧(sbt-0.12)并使用了一些难以处理的内部内容。所以我采取了另一种方法并编写了一个新的插件: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任务,它将发布到两个存储库。 您还可以使用不同的配置发布到不同的存储库。查看usage docs了解详情。