2014-04-18 67 views
3

有沒有人(在我的情況TGZ)使用SBT-以太網部署到關係回購發表SBT-本機打包製作神器? (我需要這個用於時間戳快照,特別是nexus的工件解析REST資源中的「正確」版本標記)。使用SBT-以太網部署與SBT-本機打包

我可以做一個或另一個,但不能弄清楚如何在通用的packagedArtifacts添加到SBT-以太網部署部署到一舉兩得的工件。我懷疑追求的路徑是通過addArtifact()打包文物在通用或創建另一個AetherArtifact,然後重寫/替換deployTask使用該AetherArtifact?

任何幫助非常感謝。

回答

1

好的,我覺得我足夠驚訝。如果有更好的方法去做,我很樂意聽到。不愛盲Option.get有..

val tgzCoordinates = SettingKey[MavenCoordinates]("the maven coordinates for the tgz") 

    lazy val myPackagerSettings = packageArchetype.java_application ++ deploymentSettings ++ Seq(
    publish <<= publish.dependsOn(publish in Universal), 
    publishLocal <<= publishLocal.dependsOn(publishLocal in Universal) 
) 

    lazy val defaultSettings = buildSettings ++ Publish.settings ++ Seq(
    scalacOptions in Compile ++= Seq("-encoding", "UTF-8", "-target:jvm-1.7", "-deprecation", "-feature", "-unchecked", "-Xlog-reflective-calls"), 
    testOptions in Test += Tests.Argument("-oDF") 
) 

    lazy val myAetherSettings = aetherSettings ++ aetherPublishBothSettings 

    lazy val toastyphoenixProject = Project(
    id = "toastyphoenix", 
    base = file("."), 
    settings = defaultSettings ++ myPackagerSettings ++ myAetherSettings ++ Seq(
     name in Universal := name.value + "_" + scalaBinaryVersion.value, 
     packagedArtifacts in Universal ~= { _.filterNot { case (artifact, file) => artifact.`type`.contains("zip")}}, 
     libraryDependencies ++= Dependencies.phoenix, 
     tgzCoordinates := MavenCoordinates(organization.value + ":" + (name in Universal).value + ":tgz:" + version.value).get, 
     aetherArtifact <<= (tgzCoordinates, packageZipTarball in Universal, makePom in Compile, packagedArtifacts in Universal) map { 
     (coords: MavenCoordinates, mainArtifact: File, pom: File, artifacts: Map[Artifact, File]) => 
      createArtifact(artifacts, pom, coords, mainArtifact) 
     } 
    ) 
) 
1

我帶着彼得的解決方案,並重新設計稍微,直接創造了MavenCoordinates避免裸Option.get

import aether.MavenCoordinates 
import aether.Aether.createArtifact 

name := "mrb-test" 

organization := "me.mbarton" 

version := "1.0" 

crossPaths := false 

packageArchetype.java_application 

publish <<= (publish) dependsOn (publish in Universal) 

publishLocal <<= (publishLocal) dependsOn (publishLocal in Universal) 

aetherPublishBothSettings 

aetherArtifact <<= (organization, name in Universal, version, packageBin in Universal, makePom in Compile, packagedArtifacts in Universal) map { 
    (organization, name, version, binary, pom, artifacts) => 
     val nameWithoutVersion = name.replace(s"-$version", "") 
     createArtifact(artifacts, pom, MavenCoordinates(organization, nameWithoutVersion, version, None, "zip"), binary) 
} 

nameWithoutVersion取代各地SBT本土作品包裝機包括在工件名稱版本:

  • 以前me/mbarton/mrb-test-1.0/1.0/mrb-test-1.0.zip
  • 後:me/mbarton/mrb-test/1.0/mrb-test-1.0.zip

crossPaths避免該版本上Scala的後綴。

+0

看起來像乙醚有一些突破性的變化。這個答案的現代化的任何機會? – JMess

+0

請參閱下面的答案。 – ngarthl

2

我是SBT-以太網部署插件的作者,我只是過來了這一職務。

import aether.AetherKeys._ 

crossPaths := false //needed if you want to remove the scala version from the artifact name 

enablePlugins(JavaAppPackaging) 

aetherArtifact := { 
    val artifact = aetherArtifact.value 
    artifact.attach((packageBin in Universal).value, "dist", "zip") 
} 

這也將發佈其他主要神器。

如果要禁用主神器的發佈,那麼你將需要重寫神器座標。 Maven需要一個主要的神器。

我添加了一個方法來取代用於此目的的主神器,但現在我可以看到的方式是一種有缺陷的。它仍會假定該工件是作爲jar文件發佈的。由於POM包裝默認由SBT設置爲jar,所以主要工件類型被鎖定到該工件類型。

如果這是一個應用程序,那麼這種限制可能是OK的,因爲Maven將永遠不會解決到神器。

「正確」的方式Maven的來講是一個分類的POM文件「POM」添加到神器,改變「包裝」。我們會看看是否可以改變這個特定的部分。