我们使用sbt
和xsbt-web-plugin
来开发我们的liftweb应用程序。在我们的项目构建中,我们有几个子项目,我们使用Project
的dependencies
在所有子项目之间共享一些东西。
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文件的任何更改都会导致应用程序重新启动jetty。这很烦人,因为这样的重新加载需要大量的资源。
所以我开始研究如何防止这种情况发生,甚至发现有人提到watchSources
sbt任务,该任务扫描更改的文件。
但是,添加此代码作为watchSources
修改(println
打印所有文件的事件)并不能阻止每次更改位于core
resources
文件夹中的资产时重新加载Web应用程序。
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")
} }
)
我还尝试将excludeFilter
添加到unmanagedSorces
、unmanagedResorces
中,但没有成功。
我不是sbt专家,这样的设置修改对我来说更像是一种魔法(而不是一种常见的代码)。同样,文档中似乎也没有发现这样的调优=(有人能帮我防止sbt在每次资产文件更改时重新加载webapp吗?
非常感谢!
使用watchSources
是正确的,但也需要排除资源目录本身:
watchSources ~= { (ws: Seq[File]) =>
ws filterNot { path =>
path.getName.endsWith(".js") || path.getName == ("resources")
}
}
你能从使用"resources"文件夹切换到使用"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