1

我对 SBT 非常陌生,需要为我的一个项目创建一个 RPM 包。RPM 仅包含 1 个文件,这是一个由 sbt-onejar 插件创建的 one-jar)。我想使用 sbt-native-packager 插件并在 /project 目录下创建了一个 Packagin.scala 文件,如下所示:

object Packaging {
  val settings: Seq[Setting[_]] = packagerSettings ++ deploymentSettings ++ mapGenericFilesToLinux ++ Seq(

    maintainer := "Team",
    packageSummary := "Summary",
    packageDescription := """Description""",

    mappings in Universal += {
      file("target/scala-2.10/projectname_2.10-0.1-one-jar.jar") -> "/opt/projectname/projectname-0.1.jar"
    },

    linuxPackageMappings in Rpm <+= (baseDirectory) map { _:File =>
      (packageMapping(file("target/scala-2.10/projectname_2.10-0.1-one-jar.jar") -> "/opt/projectname/projectname-0.1.jar")
        withUser "someusr" withGroup "somegroup" withPerms "0755")
    },

    name in Rpm := "projectname",
    version in Rpm <<= version apply { sv => sv split "[^\\d]" filterNot (_.isEmpty) mkString "." },
    rpmRelease := "1",
    rpmVendor := "Vendor",
    rpmUrl := Some("url"),
    rpmGroup := Some("group"),
    rpmLicense := Some("BSD")
  )
}

1)我不想硬编码文件名。而不是让"target/scala-2.10/projectname_2.10-0.1-one-jar.jar"我需要一种使用现有 SettingKey 的方法,即target + "scala-" + scalaVersion + "/" + name + "_" + scalaVersion + "-" + version + "-one-jar.jar"- 你如何做到这一点=

2) 对于rpmRelease := "1"我想使用系统属性的值,即在 Maven 中我会这样做${rpm.buildNumber},它在 SBT 中如何工作?

3) 关于 sbt-native-packager 插件,有什么我应该做的更好的吗?

4

1 回答 1

3

1)您应该始终在 sbt 中使用任务输出而不是原始文件系统查找。因为 sbt 具有并行执行功能,如果您不明确依赖任务的输出,则无法保证在运行任务之前会创建文件。

在这种情况下,您希望将包映射行更改为如下所示:

mappings in Universal += {
  oneJar.value -> "/opt/projectname/projectname-0.1.jar"
},

其中oneJar密钥在onejar 插件中定义。

2) Sbt 只使用 scala 作为构建语言,因此您可以类似地获取系统属性(但也请提供默认值):

rpmRelease := Option(sys.props("rpm.buildNumber")) getOrElse "1"

3) 现在您正在定义一个通用包在 Rpm 中用不同的用户重新定义同一个文件。这些mapGenericFilesToLinux设置仍然缺少一些自定义,但如果您不创建通用发行版,您应该能够删除那部分设置,而是直接配置您的 linux 包:

linuxPackageMappings in Rpm <+= (oneJar) map { jar:File =>
  (packageMapping(jar -> "/opt/projectname/projectname-0.1.jar")
    withUser "someusr" withGroup "somegroup" withPerms "0755")
},
于 2013-12-09T16:55:43.987 回答