我是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插件,我有什么办法可以做得更好吗?
答案 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")
},