Изменение каталога установки для rpm с помощью sbt native-packager

Я пытаюсь собрать пакет rpm с помощью sbt-native-packager, который устанавливается в пользовательский каталог, например, /opt/myapp вместо /usr — из-за внутренних требований политики.

У меня есть build.sbt, который будет собирать стандартный rpm, но я в тупике, когда дело доходит до изменения каталога. Мои извинения - я новичок в scala, sbt и родном пакете.

Я использую mapGenericFilesToLinux и хотел бы сохранить его структуру — просто изменив первую часть целевого каталога.

Я нашел этот фрагмент кода в выпуске git hub https://github.com/sbt/sbt-native-packager/issues/4#issuecomment-6731183

linuxPackageMappings <+= target map { target =>
  val src = target / "webapp"
  val dest = "/opt/app"
  LinuxPackageMapping(
  for {
    path <- (src ***).get
    if !path.isDirectory
  } yield path -> path.toString.replaceFirst(src.toString, dest)
 )
}

Я считаю, что хочу сделать что-то подобное, кроме

linuxPackageMappings in Rpm <++= <SOMETHING HERE> { 
   // for loop that steps through the source and destination and modifies the directory
}

Заранее благодарю за любую помощь

пока, Пэм


person pamduffy    schedule 14.12.2013    source источник
comment
сбт 0,12 или 0,13? Если 0.13, просто используйте ++= и новый .value на ключах. В противном случае я отвечу полным ответом.   -  person jsuereth    schedule 16.12.2013
comment
Спасибо за ответы. Это версия 0.12.4 sbt, и она используется как часть игрового фреймворка (v2.2.0).   -  person pamduffy    schedule 18.12.2013


Ответы (1)


Итак, в sbt 0.12 вам нужно убедиться, что вы указали все зависимые ключи, которые вы хотите использовать, прежде чем объявлять желаемое значение. Итак, давайте представим две вещи:

  1. linuxPackageMappings содержит все ваши сопоставления для упаковки.
  2. linuxPackageMappings in Rpm к нему напрямую ничего не добавлено.

Мы возьмем значение из linuxPackageMappings и изменим каталог для linuxPackageMappings in Rpm:

linuxPackageMappings in Rpm <<= (linuxPackageMappings) map { mappings => 
  // Let's loop through the mappings and alter their on-disc location....
  for(LinuxPackageMapping(filesAndNames, meta, zipped) <- mappings) yield {
     val newFilesAndNames = for {
        (file, installPath) <- filesAndNames
     } yield file -> installPath.replaceFirst("/usr/share/app", "/opt/app")
     LinuxPackageMapping(newFilesAndNames, meta, zipped) 
  }
}

Что это делает, так это вырывает сопоставления пакетов linux (которые включают в себя, следует ли использовать файлы gzip, а также владельцев / разрешения пользователей / групп) и изменяет путь установки каждого файла.

Надеюсь, это поможет! В sbt-native-packager.NEXT (не выпущен) вы можете настроить место установки по умолчанию.

person Community    schedule 18.12.2013
comment
Спасибо за исчерпывающий ответ. Когда я попробовал код как есть в моем build.sbt, я получил следующую ошибку, относящуюся к последней строке LinuxPackageMapping. ошибка: не найдено: значение newFilesAndNames - person pamduffy; 20.12.2013
comment
Я попытался переместить эту строку внутри фигурной скобки выше, чтобы она находилась в той же области, что и val, и это скомпилировалось, но позже вызвало проблему, когда символическая ссылка имела ошибку «Файл существует» - я думаю, потому что этот код вызывался несколько раз. Должен ли я также изменить символические ссылки или есть что-то еще, что нужно сделать, чтобы исправить первую ошибку? - person pamduffy; 20.12.2013
comment
Я исправил код, чтобы он был правильным. Проблема заключалась в том, что я использовал ‹++= вместо ‹‹=, извините. Вы хотите заменить предыдущие сопоставления пакетов Linux. То, что я перечислил ранее, было добавлением к предыдущим. - person jsuereth; 20.12.2013
comment
Я попробовал этот подход, и хотя каталог установки в rpm изменен на нужное место, rpm больше не упаковывает скрипт init.d. У меня есть переопределение сценария запуска в моем src/template/start, так что, возможно, это как-то сломает это. Теперь мой RPM не устанавливается, так как в target/universal/tmp/bin почему-то отсутствует файл systemv-init. Любая идея, как обойти это? - person Marcin; 15.10.2014