sbt.build для нескольких проектов и playframework

Обновлять:

Итак, проблема, которую я пытаюсь понять, заключается в том, почему у меня не может быть build.sbt в корневой папке. Даже если я определю lazy val root = ... в корневой папке build.sbt, основной класс не будет найден.

Эта ссылка на реддит:

https://www.reddit.com/r/scala/comments/4igc9x/sbt_playframework_no_main_class_detected/

предлагает решение проблемы. В то время как sbt demo/run действительно выполняет приложение для воспроизведения, я хотел бы в конечном итоге просто sbt run из корневого проекта скомпилировать и все проекты, а затем запустить сервер.

Кто-нибудь может помочь здесь?

=================================================================

Старый вопрос:

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

У меня есть следующая структура (большинство файлов опущены для краткости):

.
|-- build.sbt
|-- project/
|   |-- build.properties
|   |-- plugins.sbt
|   |-- project/
|-- demo/
|   |-- build.sbt
|   |-- app/
|   |-- conf/
|   |    |-- application.conf
|   |    |-- routes
|   |-- public/
|   |-- test/

внутри файла корневого каталога build.sbt у меня есть следующее.

name := "demo-root"
organization := "com.example"


scalaVersion in ThisBuild := "2.11.11"

lazy val root = (project in file("."))
  .dependsOn(demo)
  .aggregate(demo)

lazy val demo = project
  .enablePlugins(PlayScala)

Я определил addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.14") внутри plugins.sbt в корне project/.

внутри demo/build.sbt у меня есть

name := "demo"

version in ThisBuild := "1.0-SNAPSHOT"

libraryDependencies += filters
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "2.0.0" % Test

Теперь, когда я выполняю sbt run, я получаю следующую ошибку:

java.lang.RuntimeException: No main class detected.
    at scala.sys.package$.error(package.scala:27)
[trace] Stack trace suppressed: run last root/compile:run for the full output.
[error] (root/compile:run) No main class detected.

Однако если я помещу корень build.sbt и корень project/ внутрь demo/ и попытаюсь sbt run, проект успешно скомпилируется, и я смогу получить доступ к игровому серверу обычным способом.

Почему вылетает эта ошибка? Нужно ли явно объявлять основной класс для проекта воспроизведения в корневом каталоге build.sbt? Я следую инструкциям на странице http://www.scala-sbt.org/0.13/docs/Multi-Project.html, и я немного растерялся. Любая помощь в правильном направлении будет оценена по достоинству.

Для справки ---

версия сбт: 0.13.15

Скала версия: 2.11.11

версия плагина для игры: 2.5.14


person clo_jur    schedule 12.06.2017    source источник
comment
строки libraryDependencies из корня build.sbt относятся к demo/build.sbt, также вам не нужно .enablePlugins(PlayScala) в корне build.sbt, как вы уже делаете это в demo/build.sbt (куда он относится). Как дела после их замены?   -  person Frederic A.    schedule 13.06.2017


Ответы (1)


В корневом проекте нет основного класса, только в демонстрационном проекте.

При запуске sbt в корневом проекте необходимо использовать следующие команды:

  • project demo
  • run

эквивалентная однострочная может быть: sbt demo/run

Что касается ваших обновлений, я не знаю, как это сделать, я бы не советовал, и я почти уверен, что sbt не сделает это из коробки для вас.

Помните, что может быть много подпроектов, каждый со своим основным классом(ами). Что в такой ситуации должен был сделать sbt?

В качестве альтернативы можно было бы определить проект игры как корневой/агрегат и иметь там подпроекты, как показано в документе по игре: https://www.playframework.com/documentation/2.5.x/SBTSubProjects.#Project-structure

person Frederic A.    schedule 13.06.2017