在SBT中为sbt-native-packager的packageMappings构建路径

时间:2013-12-06 17:22:49

标签: scala sbt rpm sbt-native-packager

我是SBT的新手,需要为我的一个项目创建一个RPM包。 RPM只包含1个文件,它是由sbt-onejar插件创建的一个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"我想使用System属性,即在Maven中我会${rpm.buildNumber},这在SBT中是如何工作的?

3)对于sbt-native-packager插件,我有什么办法可以做得更好吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

onejar plugin中定义了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")
},