2014-01-08 23 views
13

我正在升級Nexus版本。作爲該過程的一部分,我建立了一個新的Nexus實例,它將與舊版Nexus實例並行運行。如何發佈到SBT中的多個存儲庫?

在遷移到新實例時,我想徹底測試並審查新實例,然後再拔出舊實例上的插件。這要求我暫時修改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

當你看到sbt-multi-publish時,你是對的。您能否更新問題以反映您在嘗試使用時遇到的問題? (提供你的build.sbt,project/*。sbt,project/*。scala的內容,這樣我們可以提供幫助) – Jean

回答

3

隨着CommandsHow to change a version setting inside a single sbt command?我可以定義一個新的命令 - myPublishTo - 即執行原publish任務之前改變設定publishTo

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 - 在build.sbt將執行使用;一系列命令 - pxxxpyyypxy

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 
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

相關問題