2

我们正在使用sbtwithxsbt-web-plugin来开发我们的 liftweb 应用程序。在我们的项目构建中,我们有几个子项目,我们使用dependenciesaProject在所有子项目之间共享一些东西。

object ProjectBuild extends Build {
//...

lazy val standalone = Project(
  id = "standalone",
  base = file("standalone"),
  settings = Seq(...),
  dependencies = Seq(core) // please notice this
)

lazy val core = Project(
  id = "core",
  base = file("core"),
  settings = Seq(...)
}
// ...
}

为了简化开发,我们使用'project standalone' '~;container:start; container:reload /'命令自动重新编译更改的文件。

我们决定也为共享core项目中的一些公共资产提供服务。这适用于电梯。但是当我们将文件添加到core/src/main/resources/toserve文件夹时,我们面临的是对任何 javascript 或 css 文件的任何更改都会导致应用程序重新启动码头。这很烦人,因为这种重新加载需要大量资源。

所以我开始研究如何防止这种情况,甚至发现有人提到watchSources扫描更改文件的 sbt 任务。

但是将此代码添加为watchSources修改(println打印所有文件的事件)并不能阻止每次我更改core resources文件夹中的资产时重新加载 webapp。

lazy val core = Project(
  id = "core",
  base = file("core"),
  settings = Seq(
    // ...
    // here I added some tuning of watchSources
    watchSources ~= { (ws: Seq[File]) => ws filterNot { path =>
      println(path.getAbsolutePath)
      path.getAbsolutePath.endsWith(".js")
    } }
 )

我也尝试添加excludeFilterunmanagedSorcesunmanagedResorces但没有运气。

我不是 sbt 专家,对设置的这种修改对我来说更像是一种魔法(而不是通常的代码)。文档似乎也发现了这种调整=(任何人都可以帮助我防止 sbt 在每次资产文件更改时重新加载 webapp 吗?

非常感谢!

4

2 回答 2

0

你可以从使用“资源”文件夹切换到使用“webapp”文件夹吗?这也将使您免于重新启动。这是 Lift 的演示项目(使用“webapp”):

https://github.com/lift/lift_26_sbt/

例如,“基本”模板:

https://github.com/lift/lift_26_sbt/tree/master/scala_211/lift_basic/src/main/webapp

于 2014-09-29T17:09:17.133 回答
0

使用 ,您在正确的轨道上watchSources,但您还需要排除资源目录本身:

watchSources ~= { (ws: Seq[File]) =>
  ws filterNot { path =>
    path.getName.endsWith(".js") || path.getName == ("resources")
  }
}
于 2014-09-16T18:01:18.413 回答