使用 sbt 将 Debian 软件包发布到 Artifactory

Posted

技术标签:

【中文标题】使用 sbt 将 Debian 软件包发布到 Artifactory【英文标题】:Publish Debian package to Artifactory using sbt 【发布时间】:2014-10-03 10:34:06 【问题描述】:

我正在使用 sbt-native-packager 为我的 Scala Play 2 项目创建 Debian 包并将其发布到 Artifactory 存储库。

到目前为止,我能够生成 .deb 包,但我无法将其发布到工件 URL。唯一发布的工件是 debian .changes 文件,而不是实际的 .deb 文件。

我最近升级到使用 sbt 0.13.5 和 sbt-native-packager 0.7.4 的 Play 2.3.2。这可能是相关的,因为将 .deb 文件发布到工件确实曾经与 sbt-native-packager 0.7.1 一起使用。

我已经努力理解这个问题,并确实发现在最新版本中我必须将debianChangelog in Debian := Some(file("src/debian/changelog")) 添加到我的.sbt 文件中,但我现在卡住了。

我的问题只是当我执行debian:publish 时没有发布.deb 文件。仅发布 .changes 文件:[info] published atk to http:...:8081/artifactory/atk-snapshots/atk/atk/1.0-SNAPSHOT/atk-1.0-SNAPSHOT.changes

有人知道我应该做什么来解决我的发布问题吗?

我在项目的 .sbt 文件中有以下设置作为导入和版本:

import com.typesafe.sbt.SbtNativePackager._
import com.typesafe.sbt.SbtNativePackager.NativePackagerKeys._
import com.typesafe.sbt.packager.archetypes.ServerLoader.SystemV
import NativePackagerKeys._

name := """atk"""

scalacOptions += "-target:jvm-1.7"

javacOptions ++= Seq("-source", "1.7", "-target", "1.7")

version := "1.1-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.11.1"

对于包装部分:

// Packaging info

debianChangelog in Debian := Some(file("src/debian/changelog"))

serverLoading in Debian := SystemV

packageDescription in Debian := "Parlis Elvis Adapter"

packageSummary in Debian := "Parlis Elvis Adapter"

maintainer in Debian := "Daan Hoogenboezem"

daemonUser in Linux := "ape"

daemonGroup in Linux := "ape"

sourceDirectory in Debian <<= (sourceDirectory) apply (_ / "debian")

mappings in Universal <+= (packageBin in Compile, sourceDirectory ) map  (_, src) =>
    // we are using the reference.conf as default application.conf
    // the user can override settings here
    val conf = src / "linux" / "atk" / "startup.conf"
    conf -> "etc/atk/startup.conf"


linuxPackageMappings in Debian <+= (name in Universal, sourceDirectory in Debian) map  (name, dir) =>
  (packageMapping(
    (dir / "etc/changelog") -> "/usr/share/doc/atk/changelog.gz"
  ) withUser "root" withGroup "root" withPerms "0644" gzipped) asDocs()


defaultLinuxLogsLocation in Linux := "/var/log/atk"

deploymentSettings

// Publishing
publishTo := 
  val artifactory = "http://...:8081/artifactory/"
  if (version.value.trim.endsWith("SNAPSHOT"))
    Some("snapshots" at artifactory + "atk-snapshots")
  else
    Some("releases" at artifactory + "atk-releases")


publish in Debian <<= (publish in Debian).triggeredBy(publish in Compile)

【问题讨论】:

我最初的回答是错误的。设置存在。它适用于 Nexus :( 【参考方案1】:

我的一位同事向我展示了修复程序,此处记录了该修复程序:http://www.scala-sbt.org/sbt-native-packager/DetailedTopics/deployment.html?highlight=publish

总之,需要在build.sbt中加入如下语句:

makeDeploymentSettings(Debian, packageBin in Debian, "deb")

【讨论】:

以上是关于使用 sbt 将 Debian 软件包发布到 Artifactory的主要内容,如果未能解决你的问题,请参考以下文章

SBT任务将debian文件复制到其他文件夹

使用 sbt 原生打包将 fat jar 打包成 debian

sbt-native-packager,挂钩到 debian 包的生命周期

构建 deb 包时无法使用 sbt-native-packager 打包 cron 作业

sbt-native-package Debian 与 JDKPackager

如何在sbt 1.0.x中发布自定义工件