我在开发模式下启动了我的 play 应用程序,并尝试更改索引 html 文件,但 play 没有更新它。 我的应用程序仅包含公共文件夹中的资产,为了查看更改,我必须重新启动我的应用程序。我的观察表明,play 会编译
target/web/public/main
目录中的资源,并且当 public
目录中的文件发生更改时不会更新它
我应该如何配置我的应用程序,以便在更改它时重新加载所有资产?
某些浏览器会将资源缓存在您的公共文件夹中,因此当 Play 服务器提供新内容时,您仍然会看到旧内容。如果您使用 Chrome,您可以通过执行硬重新加载 (Ctrl+Shift+R) 来清除缓存,这将强制它再次从服务器获取所有内容。
更好的解决方案是使用资产指纹识别,您可以在此处找到相关信息。这基本上意味着当资产的内容发生变化时,资产的名称也会发生变化,因此您的浏览器会意识到它需要下载新文件而不是提供缓存的文件。要做到这一点非常简单 - 在您的路线文件中,更改
GET /assets/*file controllers.Assets.at(path="/public", file)
到
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)
当您需要引用资产时,不要使用 Assets.at,而是使用 Assets.versioned ie。
<link rel="stylesheet" href="@routes.Assets.at("stylesheets/main.css")">
成为
<link rel="stylesheet" href="@routes.Assets.versioned("stylesheets/main.css")">
但是,正如 Kris 在评论中所说,如果您要使用 twirl 模板系统(索引页面位于 app/views/index.scala.html 中,而不是将其作为公共文件夹中的资产),Play 将重新编译进行任何更改后的模板并提供新页面。
这真是个愚蠢的问题。我的一个子项目包含配置
scalaSource in Compile := baseDirectory.value
,它只是覆盖了scalaSource
中的原始Compile
。改成scalaSource in ThisScope := baseDirectory.value
就解决了问题。
有时需要等待一段时间才能播放才能检测到文件变化,请尝试刷新页面几次看看是否有效
此外,如果您在特殊环境中运行 Play,例如运行从 MacOS 链接到 Docker 容器的代码,则需要对 Play 的文件更改侦听器进行一些特殊设置才能使检测工作。