2013-12-06 2 views
1

Я очень новичок в SBT и мне нужно создать пакет RPM для одного из моих проектов. RPM содержит только 1 файл, который является одним банком, созданным плагином sbt-onejar). Я хочу использовать SBT-родной-упаковщик плагин и создал файл Packagin.scala в директории/проекте, как это:Пути построения в SBT для пакета Отображения sbt-native-packager

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?

ответ

3

1) Вы всегда должны использовать вывод задачи в sbt вместо поиска исходной файловой системы. Поскольку sbt имеет параллельное выполнение, если вы не ставите явную зависимость от вывода задачи, то у вас нет гарантии, что файл будет создан до запуска вашей задачи.

В этом ключе вы хотите изменить свой пакет отображений линии быть что-то вроде этого:

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

Где ключ oneJar определяется в onejar plugin.

2) Sbt просто использует для Scala языка сборки, так что вы можете получить свойства системы аналогично (но просьба также по умолчанию):

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

3) Прямо сейчас вы определяете общий пакет и переопределяет тот же файл в Rpm с другим пользователем. В mapGenericFilesToLinux настройках все еще не имеют несколько настроек, но если вы не создаете универсальные распределения, вы должны быть в состоянии отказаться от этого немного настроек и вместо того, чтобы сразу настроить Линукс пакет:

linuxPackageMappings in Rpm <+= (oneJar) map { jar:File => 
    (packageMapping(jar -> "/opt/projectname/projectname-0.1.jar") 
    withUser "someusr" withGroup "somegroup" withPerms "0755") 
}, 
+0

Хм, как для 'rpmRelease' I реализованный наш сервер сборки Bamboo использует переменные среды. Поэтому я попытался изменить его на «rpmRelease: = Option (sys.env (« rpm.buildNumber »)) getOrElse« 1 »' в _project/Packaging.scala_, но по какой-то причине я всегда получаю «1». Когда я получаю доступ к 'sys.env (" rpm.buildNumber ")' in build.sbt, он работает. По какой-то причине переменные окружения не распространяются на Packaging.scala. – reikje

+0

Хмм, это должно быть так. Настройка порядка. У вас есть rpmRelease: = ... 'где-то еще, или вы устанавливаете собственные настройки упаковщика * после * своего собственного параметра rpmRelease? Также настройки 'project/*. Scala' вытягиваются перед настройками' build.sbt'. – jsuereth