【问题标题】:Generating static assets from SBT Web从 SBT Web 生成静态资产
【发布时间】:2017-02-25 16:13:22
【问题描述】:

我有一个基于 SBT-Web 和 Play Framework 的项目。好吧,Play 仅用于开发,然后(在 SBT/Activator 中运行 stage 命令时)所有内容都导出到静态页面并部署到一些可能甚至没有安装 Java 的网络服务器。

我目前的做法是添加一个resourceGenerator:

resourceGenerators in Assets += Def.task {
  for(year <- PageGenerator.Years) yield {
    val file = (resourceManaged in Assets).value / "assets" / s"${year.year}.html"
    println(s"Writing $file…")
    IO.write(file, PageGenerator.forYear(year))
    file
  }
}.taskValue

现在可以,但它有一些缺点:

  • 首先,我不能使用子目录。当我尝试将文件放入子目录时,它会被放入根目录。
  • 当我更改模板或源数据时,我必须重新加载项目才能使其生效。
  • 最后,我会稍微感谢使用 Twirl 或类似的东西。

如何克服这些缺点? (第一个是最重要的。解决其他缺点是一个较小的好处。)

  • 我尝试将生成代码放到流水线阶段。这在构建最终工件时有效,但在开发期间无效。
  • 想法:使用 Twirl 模板,在开发过程中动态调用它,并在管道阶段以某种方式调用它(使用一些 ClassLoader 和反射 API)。我不确定这是否是正确的方法。我是否保证在执行 sbt-web 管道阶段时已经编译了 Scala/Twirl 代码?
  • 一个 hacky 想法:生成文件到项目根目录,在开发模式下通过路由动态提供它们,在管道阶段重命名它们。这是很严重的 hack,但理论上它应该可以工作。

【问题讨论】:

    标签: scala playframework sbt playframework-2.5 sbt-web


    【解决方案1】:

    嗯,找到了主要问题的解决方案:

    Get assets to compile when running via "activator run" in Play

    仍然没有解决其他问题,所以欢迎其他答案。

    【讨论】:

      【解决方案2】:

      对于遇到此问题的任何人,这里是来自@v6ak 提到的链接的解决方案的重要部分:

      为了防止文件总是放在公共根目录中,即使它们放在子目录中,您还必须将任务输出的目录添加到resourceDirectories

      val taskOutputDir = settingKey[File]("Resource directory for task output")
      taskOutputDir  := (resourceManaged in Assets).value / "my-task"
      
      
      // ADD THIS to preserve directory structure
      resourceDirectories in Assets += taskOutputDir.value
      
      
      resourceGenerators in Assets += Def.task {
        // Generate your assets and output them to 'taskOutputDir'
        // return a Seq[File] of the generated files
      }.taskValue
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-25
        • 2016-03-08
        • 2021-01-20
        • 1970-01-01
        • 2013-10-10
        • 2015-11-22
        • 2020-04-30
        • 1970-01-01
        相关资源
        最近更新 更多