1

我目前正在使用 Play 构建网站!2.0 (2.1-RC2) 框架和 Scala。我有一堆“静态” html 文件,它们定义了 AngularJS 使用的视图(我更喜欢使用 Jade,但我似乎无法找到让 Jade 与 Play/Scala 预编译的方法。这使得感觉,因为 Jade 模板通常不是静态的)。

作为一名开发人员,对我来说最有意义的一点是,我的项目结构是将这些 html 文件与我的咖啡放在同一个位置,并减少文件 (/assets/*)。我知道 Play 希望我将它们放在我的公共文件夹中,但是我很难做到这一点。对我来说,公共文件夹应该用于库和生成的文件。

我想做的是以某种方式让 Play 将 /assets/views 中的 html 文件复制到 /public/views 作为构建的一部分。我怎么能做到这一点?

提前谢谢了!

4

2 回答 2

0

我能够弄清楚如何在 Scalatra 测试项目中执行此操作,因此我只需要修改以下代码以使其适应 Play 的文件夹结构。但是,它确实有效。它的作用是定义一个新的 sbt “插件”,并在编译时将 /src/main/html 中的所有文件复制到 /resource_managed/main/views。

希望有人会发现这很有用!

import sbt._
import Keys._
import java.io.File
import org.apache.commons.io.FileUtils._

object CopyViews extends sbt.Plugin {
  import CopyViewsKeys._

  object CopyViewsKeys {
    val copy = TaskKey[Unit]("copy-views", "Copy views into resourceManaged.")
  }

  private def copyViewsTask = (streams, sourceDirectory in copy, resourceManaged in copy) map {
    (out, source, destination) =>
      out.log.info("Copying Views to " + destination.getAbsolutePath())
      copyDirectory(source, destination)
  }

  def copyViewsSettingsIn(c: Configuration): Seq[Setting[_]] =
    inConfig(c)(Seq(
      sourceDirectory in copy <<= (sourceDirectory in c) { _ / "html" },
      resourceManaged in copy <<= (resourceManaged in c) { _ / "views" },
      copy <<= copyViewsTask
    )) ++ Seq(
      compile in c <<= (compile in c).dependsOn(copy in c)
    )

  def copyViewsSettings: Seq[Setting[_]] = 
    copyViewsSettingsIn(Compile)
}

object ModFallBuild extends Build {
  import CopyViews._ // Import in our Build so we can use in our build.sbt file.

  lazy val modfall = Project("modfall", file("."))
}

现在,在我们的 build.sbt 文件中,我们可以添加

seq(copyViewsSettings:_*)

现在在编译时复制视图:)

我敢肯定,可能有一种更简单的方法可以做到这一点,但这对我有用,并且能够让我了解构建 sbt 插件!:P

于 2013-01-14T21:28:16.767 回答
0

如果将静态 html 文件放在 public/htmls 下,则可以通过以下方式获取模板中单个文件的路径:

@routes.Assets.at("htmls/yourfile.html")

于 2013-01-14T09:32:41.737 回答