Невозможно импортировать из проекта CrossType.Pure sbt в Scala

Я пытаюсь сделать проект Play Framework с Scala.js на внешнем интерфейсе и одним общим проектом. Моя конфигурация sbt:

import sbt.Project.projectToRef

lazy val scalaV = "2.11.8"

lazy val shared = (crossProject.crossType(CrossType.Pure) in file("shared"))
  .settings(
    scalaVersion := scalaV,
    libraryDependencies ++= Seq(
      "com.mediamath" %%% "scala-json" % "1.0"
    ),
    resolvers += "mmreleases" at "https://artifactory.mediamath.com/artifactory/libs-release-global",
    addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)
  )
  // set up settings specific to the JS project
  .jsConfigure(_ enablePlugins ScalaJSPlay)


lazy val sharedJVM = shared.jvm.settings(name := "sharedJVM")

lazy val sharedJS = shared.js.settings(name := "sharedJS")

lazy val root = (project in file(".")).settings(
  scalaVersion := scalaV,
  scalaJSProjects := jsProjects,
  pipelineStages := Seq(scalaJSProd, gzip),
  routesGenerator := InjectedRoutesGenerator,
  scalikejdbcSettings,
  libraryDependencies ++= Seq(
    jdbc,
    cache,
    ws,
    evolutions,
    "org.scalatestplus.play" %% "scalatestplus-play" % "1.5.1" % Test,
    "mysql" % "mysql-connector-java" % "5.1.39",
    "com.vmunier" % "play-scalajs-scripts_2.11" % "0.5.0"
  ),
  resolvers += "scalaz-bintray" at "http://dl.bintray.com/scalaz/releases"
).
  enablePlugins(PlayScala).
  aggregate(jsProjects.map(projectToRef): _*)

lazy val jsProjects = Seq(js)


lazy val js = (project in file("client")).settings(
  scalaVersion := scalaV,
  persistLauncher := true,
  persistLauncher in Test := false,
  autoCompilerPlugins := true,
  scalacOptions ++= Seq("-unchecked", "-deprecation", "-feature"),
  libraryDependencies ++= Seq(
    "org.scala-js" %%% "scalajs-dom" % "0.9.0",
    "com.mediamath" %%% "scala-json" % "1.0"
  ),
  resolvers += "mmreleases" at "https://artifactory.mediamath.com/artifactory/libs-release-global",
  resolvers += Resolver.sonatypeRepo("releases"),
  addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full)
).enablePlugins(ScalaJSPlugin, ScalaJSPlay)

Все работает нормально, но проблема в том, что я ничего не могу импортировать из общего проекта в Scala.js и в проект Play Framework. Вот как выглядит моя общая структура проекта:

И вот как я пытаюсь импортировать это:

import services.Encryptor

Во время компиляции я получил ошибку:

не найдено: объект службы [ошибка] службы импорта.Encryptor

Как эту проблему можно исправить?

1 ответ

Решение

Прежде всего, никогда (!) Не делайте так:

lazy val sharedJVM = shared.jvm.settings(name := "sharedJVM")
lazy val sharedJS = shared.js.settings(name := "sharedJS")

Это создает новые проекты, которые получает sbt, поэтому кросс-проект больше не содержит правильных проектов. Смотрите документы для деталей.

Вместо этого используйте jsSettings а также jvmSettings:

(crossProject.crossType(CrossType.Pure) in file("shared"))
  // snip
  .jsSettings(name := "sharedJS")
  .jvmSettings(name := "sharedJVM")

lazy val sharedJVM = shared.jvm
lazy val sharedJS = shared.js

В вашей сборке кажется, что ваш js Проект не зависит от общего проекта. Поэтому, если, конечно, содержимое общего проекта недоступно.

Вам нужно

lazy val js = (project in file("client"))
  // snip
  .dependsOn(shared.js)
Другие вопросы по тегам