Как установить конкретный рабочий каталог в многомодульном проекте SBT - PullRequest
0 голосов
/ 23 мая 2019

У меня есть структура пакета, аналогичная приведенной ниже;

myapplication/
├── my-library/
│   └── src
│       └──main
│          └── scala
│   
├── my-other-library/
│   └── src/
│       └──main/
│          └── scala/
│── my-executable-project/
│   │── src/
│   │   └──main/
│   │      └── scala/
│   └── resources/
│       └── somefile.txt
└── build.sbt

Когда я запускаю тесты через sbt или intellij;

  • относительные файлы (например, new File("build.sbt")) относительно myapplication.

Когда я запускаю проект с reStart через sbt-revolver или из двоичного файла;

  • my-executable-project является рабочим каталогом. Таким образом, чтобы получить доступ к тому же файлу build.sbt, я должен использовать new File("../build.sbt")

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

Только my-executable-project упаковывается и запускается в производство. И когда он снова запускается, my-executable-project является рабочим каталогом.

Единственное неудобство на данный момент - это когда я хочу сослаться на относительный файл, он отличается в тестах и ​​регулярных запусках.

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


Редактировать: Так выглядит мой единственный build.sbt;

lazy val root = project
  .in(file("."))
  .disablePlugins(RevolverPlugin)
  .aggregate(library1, library2, service, common)
  .settings(
    settings,
    name := "parent",
    version := "0.1"
  )

lazy val common = project
  .in(file("common"))
  .disablePlugins(RevolverPlugin)
  .settings(
    settings,
    name := "common",
    libraryDependencies ++= ... some deps ...
  )

lazy val library1 = project
  .in(file("library1"))
  .disablePlugins(RevolverPlugin)
  .dependsOn(common)
  .settings(
    settings,
    name := "library1",
    libraryDependencies ++= ... some deps ...
  )

lazy val library2 = project
  .in(file("library2"))
  .disablePlugins(RevolverPlugin)
  .dependsOn(common)
  .settings(
    settings,
    name := "library2",
    libraryDependencies ++= ... some deps ...
  )

lazy val service = project
  .in(file("service1"))
  .dependsOn(library1, library2)
  .enablePlugins(JavaServerAppPackaging)
  .settings(
    settings,
    name := "service1",
    mappings in Universal ++= directory("service1/src/main/resources"),
    mainClass in Compile := Some("my.main.class.service.Main"),
    Revolver.enableDebugging(port = 5005, suspend = false),
    libraryDependencies ++= ... some deps ...
  )

1 Ответ

1 голос
/ 24 мая 2019

Я решил эти проблемы, поместив все sbt вещи в родительский проект.

См. Здесь документ: https://www.scala -sbt.org / 1.x / docs / Multi-Project.html

Основная структура build.sbt выглядит следующим образом:

lazy val root = (project in file("."))
  .aggregate(util, core)

lazy val util = (project in file("util"))

lazy val core = (project in file("core"))

Каждый проект можно затем настроить следующим образом:

lazy val core = (project in file("core"))
  .enablePlugins(PlayScala, BuildInfoPlugin)
  .settings(generalConf.noPublishSettings)
  .settings(generalConf.buildInfoSettings)
  .settings(coreConf.settings)

Здесь вы видите, чтомы используем общие конфиги generalConf и специальный конфиг проекта (coreConf).Эти файлы находятся в папке /project.

...