Я нахожусь в процессе объединения нескольких крупных проектов 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