Использование sbt-aether-deploy с sbt-native-packager

Кто-нибудь публиковал созданный sbt-native-packager артефакт (в моем случае tgz) с использованием sbt-aether-deploy в репозитории Nexus? (Мне это нужно для моментальных снимков с временными метками, в частности, для «правильного» тега версии в ресурсе REST разрешения артефактов Nexus).

Я могу сделать одно или другое, но не могу понять, как добавить packagedArtifacts в Universal к артефактам, которые sbt-aether-deploy развертывает для выполнения обоих.

Я подозреваю, что путь следования будет заключаться в addArtifact() packagedArtifacts in Universal или создании другого AetherArtifact, а затем переопределить/заменить deployTask для использования этого AetherArtifact?

Любая помощь очень ценится.


person Peter vR    schedule 18.04.2014    source источник


Ответы (3)


Я автор плагина sbt-aether-deploy, и я только что наткнулся на этот пост.

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.

Если это приложение, то с этим ограничением, вероятно, все в порядке, поскольку Maven никогда не превратит его в артефакт.

«Правильный» способ в терминах Maven - добавить классификатор к артефакту и изменить «упаковку» в файле POM на «pom». Посмотрим, смогу ли я изменить эту конкретную часть.

person ngarthl    schedule 05.09.2017

Хорошо, я думаю, что получил это достаточно удивительно. Если есть лучший способ сделать это, я хотел бы услышать. Не люблю этот слепой вариант.

  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)
      }
    )
  )
person Peter vR    schedule 18.04.2014

Я взял решение Питера и немного переработал его, избегая голого Option.get, создавая MavenCoordinates напрямую:

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 в версии.

person mbarton    schedule 16.05.2014
comment
Похоже, у эфира есть некоторые критические изменения. Есть ли шанс на модернизацию этого ответа? - person JMess; 30.06.2017
comment
Смотрите мой ответ ниже. - person ngarthl; 15.09.2017