Построение путей в SBT для packageMappings sbt-native-packager

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

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?


person reikje    schedule 06.12.2013    source источник


Ответы (1)


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")
},
person jsuereth    schedule 09.12.2013
comment
Хм, что касается rpmRelease, я понял, что наш сервер сборки Bamboo использует переменные среды. Поэтому я попытался изменить его на rpmRelease := Option(sys.env("rpm.buildNumber")) getOrElse "1" в project/Packaging.scala, но по какой-то причине я всегда возвращаю 1. Когда я обращаюсь к sys.env("rpm.buildNumber") в build.sbt, он работает. По какой-то причине переменные среды не распространяются в Packaging.scala. - person reikje; 10.12.2013
comment
хм, так и должно быть. Настройка порядка имеет значение. У вас есть rpmRelease := ... где-то еще, или вы устанавливаете собственные настройки упаковщика после вашей собственной настройки rpmRelease? Также project/*.scala настройки подтягиваются перед build.sbt настройками. - person jsuereth; 10.12.2013