Sbt 构建挂在随机阶段

Sbt build hangs on random stages

我有一个多项目 sbt 构建,它在执行的不同阶段挂起(在编译一个或多个模块之后)。

如能提供有关其挂起的可能原因的任何意见,我将不胜感激。

为了提供上下文,此 构建包含三个模块:

build.sbt 文件:

name := "my-project"

version := "0.1"

scalaVersion := "2.12.4"

lazy val `my-project` = (project in file(".")).aggregate(backend, frontend, modelJvm, modelJs)

lazy val backend =
  (project in file("backend"))
    .dependsOn(modelJvm)
    .settings(
      libraryDependencies ++= Seq(
"com.lihaoyi" %% "upickle" % "0.5.1",
        "com.typesafe.akka" %% "akka-http" % "10.0.11"
      ),
      resourceGenerators in Compile += Def.task {
        val f1 = (fastOptJS in Compile in frontend).value
        val f2 = (packageScalaJSLauncher in Compile in frontend).value
        Seq(f1.data, f2.data)
      }.taskValue,
      watchSources ++= (watchSources in frontend).value
    )

lazy val frontend =
  (project in file("frontend"))
    .enablePlugins(ScalaJSPlugin)
    .settings(
      scalaJSUseMainModuleInitializer := true,
      libraryDependencies ++= Seq(
        "com.lihaoyi" %%% "scalatags" % "0.6.7",
        "org.scala-js" %%% "scalajs-dom" % "0.9.2"
      )
    )
    .dependsOn(modelJs)

lazy val model = (crossProject.crossType(CrossType.Pure) in file("model"))
                  .settings(
                     libraryDependencies ++= Seq(
                       "com.lihaoyi" %%% "upickle" % "0.5.1"
                     )
                  )

lazy val modelJs = model.js
lazy val modelJvm = model.jvm

plugins.sbt 文件:

addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.22")

addSbtPlugin("io.spray" % "sbt-revolver" % "0.9.1")

build.properties:

sbt.version = 1.1.0

构建过程示例:

[info] Compiling 7 Scala sources to .../backend/target/scala-2.12/classes ...
[info] Compiling 8 Scala sources to ...frontend/target/scala-2.12/classes ...
[warn] there was one deprecation warning (since 0.6.20); re-run with -deprecation for details
[warn] one warning found
[info] Done compiling.

在那之后 sbt 没有响应。我在任务管理器和 jvisualvm 中看到与此构建对应的 java 进程消耗了所有分配给它的内存(Xmx 值)。

欢迎任何suggestions/advices。

Scala.js 非常耗费内存,作为对编译时间的权衡。 1GB对于一个典型的项目来说肯定是不够的。

开始sbt我推荐至少-Xmx3G,有能力的话4G。

请注意,直接在你的项目中源文件的数量不是很优雅。您所有的传递依赖项都计入使用的总内存,因为它们需要加载到内存中才能与您的项目链接在一起。

原来不是内存问题而是库问题。在此构建中 upickle 库用于共享模块中的 json 序列化:

"com.lihaoyi" %%% "upickle" % "0.5.1"

根据用法,该库似乎使用 来生成 serialization/deserialization 机制。一旦我迁移到

"com.github.benhutchison" %%% "prickle" % "1.1.13"

构建能够在没有太多内存的情况下在几秒钟内完成 - 大约 -Xmx1G。我将尝试减少示例并将问题提交给 github。

将日志级别设置为调试可能会有所帮助,比如

logLevel := Level.Debug

如所述here,例如