Как использовать sbt-native-packager с несколькими проектами

Я нахожусь в процессе объединения нескольких крупных проектов scala в один. В настоящее время они разделяют код, используя вырезание и вставку (кода не очень много), и я делаю это так, чтобы была общая банка утилит. Большинство этих проектов развернуты в облаке Amazon и используют sbt-native-packager для их упаковки.

Моя проблема в том, что я не знаю, как настроить собственный менеджер sbt для нескольких проектов. Я тоже не очень с ней знаком, придя в проект уже после того, как была проделана вся первоначальная работа.

Я уменьшил проблему до минимума, который я могу получить. Существует репозиторий git по адресу https://github.com/stave-escura/multiprojectissue.git что демонстрирует проблему

В проекте/plugins.sbt важные строки:

addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.0.6")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.0")

build.sbt слишком длинный, чтобы поместить его здесь, но его грубая форма

import com.typesafe.sbt.SbtNativePackager
import com.typesafe.sbt.packager.archetypes.JavaServerAppPackaging

enablePlugins(SbtNativePackager)

enablePlugins(JavaServerAppPackaging)

lazy val commonSettings = Seq(
  ...
  scalaVersion := "2.11.8",
  assemblyJarName in assembly := s"${name.value}.jar",
  assemblyMergeStrategy in assembly := {
    case "BUILD" => MergeStrategy.discard
    case other => MergeStrategy.defaultMergeStrategy(other)
  }
)

lazy val project1Settings = commonSettings ++ Seq(
  rpmVendor := "someOrganisation",
  packageDescription in Rpm := "Some description1",
  rpmLicense := Some("Copyright 2016 someOrganisation. All rights reserved."),
  rpmRequirements := Seq(
    "java-1.8.0-openjdk"
  ),
  version in Rpm := "1",
  rpmRelease := version.value,
  rpmDaemonLogFile := s"${name.value}.log",
  daemonUser in Linux := "someUserName",
  daemonGroup in Linux := (daemonUser in Linux).value,
  rpmPost := Some(
    """|chkconfig --add someService1
      |chkconfig someService1 on
    """.stripMargin),
  linuxPackageMappings ++= Seq()    // <--- line 53
)


lazy val project2Settings = commonSettings ++ Seq(
  identical to project 1 settings except
  packageDescription in Rpm := "Some description2",
  rpmPost := Some(
    """|chkconfig --add someService2
      |chkconfig someService2 on
    """.stripMargin),
  linuxPackageMappings ++= Seq()   // <--- line 72
)

lazy val project1 = (project in file("components/service1")).settings(project1Settings: _*)

lazy val project2 = (project in file("components/service2")).settings(project2Settings: _*)

В реальном проекте linuxPackageMappings достаточно сложны и являются моей проблемой. Они различаются между проектами. Когда я загружаю build.sbt в sbt, я получаю сообщение об ошибке

References to undefined settings: 

  project2/*:linuxPackageMappings from project2/*:linuxPackageMappings (~/git/multiprojectissue/build.sbt:72)

  project1/*:linuxPackageMappings from project1/*:linuxPackageMappings (~/git/multiprojectissue/build.sbt:53)

    at sbt.Init$class.Uninitialized(Settings.scala:265)
    ...
    at xsbt.boot.Boot.main(Boot.scala)
[error] References to undefined settings: 
[error] 
[error]   project2/*:linuxPackageMappings from project2/*:linuxPackageMappings (/Users/ricep02/git/multiprojectissue/build.sbt:72)
[error] 
[error]   project1/*:linuxPackageMappings from project1/*:linuxPackageMappings (/Users/ricep02/git/multiprojectissue/build.sbt:53)

Строки 53 и 72 отмечены во фрагменте build.sbt, который я включил выше.

Вещи, которых я не знаю У меня недостаточно опыта в этом, чтобы понять, почему в проекте есть sbt-assembly и sbt-package manager. Я прокомментировал sbt-сборку из plugins.sbt и до сих пор сталкиваюсь с этой проблемой, поэтому на данный момент я не думаю, что это способствует

Что я пробовал Я пытался поместить настройки подпроекта в файлы build.sbt, связанные с фактическими компонентами. Я получаю ту же проблему. Я также хорошо рассмотрел пример проекта, такой как https://github.com/muuki88/sbt-native-packager-examples/tree/master/multi-module-build и прочитали документацию по адресу http://www.scala-sbt.org/sbt-native-packager/ достаточно внимательно, хотя я m не «опытен» с этим: только на уровне «прочитать документацию». Я также рассмотрел такие вопросы, как Как настроить sbt-native-packager в проекте с одним модулем с несколькими сетями и Как создать базовую настройку проекта с помощью sbt-native-packager

Вещи, которые работают Если оставить packageMappings в «основном теле» build.sbt, это не вызовет «проблемы с загрузкой sbt», но я пока не знаю, действительно ли он соберет пакет!

Программный стек

  • Операционная система: MacOS
  • Ява: 1.8.0_74-b02
  • Скала: 2.11.8
  • сбт: 0.13.8
  • sbt-родной-упаковщик 1.0.6

person Stave Escura    schedule 20.06.2016    source источник


Ответы (1)


Похоже, что SbtNativePackager нужно включить для project1 и project2 в их настройках.

Попробуйте изменить настройки, добавив enablePlugins(SbtNativePackager) :

lazy val project1Settings = commonSettings ++ Seq(
    rpmVendor := "someOrganisation",
    packageDescription in Rpm := "Some description1",
    rpmLicense := Some("Copyright 2016 someOrganisation. All rights reserved."),
    rpmRequirements := Seq(
        "java-1.8.0-openjdk"
    ),
    version in Rpm := "1",
    rpmRelease := version.value,
    rpmDaemonLogFile := s"${name.value}.log",
    daemonUser in Linux := "someUserName",
    daemonGroup in Linux := (daemonUser in Linux).value,
    rpmPost := Some(
        """|chkconfig --add someService1
           |chkconfig someService1 on
        """.stripMargin),
    enablePlugins(SbtNativePackager),
    linuxPackageMappings ++= Seq()    // <--- line 53
)

а также аналогично для проекта 2.

Я рекомендую приобрести такую ​​книгу, как «SBT в действии», которая поможет вам начать работу с «простым» инструментом сборки.

person Darkphenom    schedule 23.06.2016
comment
Похоже, enablePlugins(SbtNativePackager) находится в интересном месте. Вы все еще помните, скомпилировали ли вы вышеприведенное? Это DslEntry как тип, а не Def.SettingsDefinition. sbt 0.13.15, sbt-родной-упаковщик 1.2.0 - person akauppi; 28.06.2017
comment
Позовите enablePlugins(...) на экземпляр Project, ради всего святого! Как в val foo = (project in file(...)).settings(...).enablePlugins(...). Это будет работать. - person Feuermurmel; 10.07.2019