Scala Play Framework 2.2.x:静态资产位置在生产中不起作用

Scala Play Framework 2.2.x:静态资产位置在生产中不起作用,scala,playframework,playframework-2.2,Scala,Playframework,Playframework 2.2,在生产中访问编译的资产位置时遇到问题 我的策略是在开发时在“app/assets/ui”中为我的资产提供服务,在生产时在“public”中为我的资产提供服务,如下面我的conf/routes文件所示 #{if(play.Play.mode.isDev())} GET /assets/*file controllers.common.Assets.at(path="/app/assets/ui", file) #{/} #{else} GET /assets/*fil

在生产中访问编译的资产位置时遇到问题

我的策略是在开发时在“app/assets/ui”中为我的资产提供服务,在生产时在“public”中为我的资产提供服务,如下面我的conf/routes文件所示

#{if(play.Play.mode.isDev())}
  GET     /assets/*file    controllers.common.Assets.at(path="/app/assets/ui", file)
#{/}
#{else}
  GET     /assets/*file controllers.common.Assets.at(path="/public", file)
#{/}
因为我在“public”之外定义了资产映射,所以在Build.scala中添加了以下行

playAssetsDirectories <+= baseDirectory / "app/assets/ui"

playAssetsDirectoriesPlayframework 2.x不支持路由文件中的条件语句。1.x版本有此功能,但已被删除

您的路由文件中只有两条具有相同URI模式的路由,
/assets/file*
。其他行作为注释被忽略,因为它们以磅字符开头,
。我认为,由于两条路线的模式是相同的,第一条路线捕捉所有东西,第二条路线什么也不做

这并不完全是你想要做的,但我认为你可以让路线模式有点不同,它应该会起作用

GET   /assets/dev/*file   controllers.common.Assets.at(path="/app/assets/ui", file)
GET   /assets/*file       controllers.common.Assets.at(path="/public", file)

正如@estmatic所提到的,您的条件in
路由将不会被计算

由于将应用程序
模式
之间的差异整合到文件中通常非常有用,因此我建议您扩展
全局设置
(如果您还没有),并覆盖
onLoadConfig
方法:

class Settings extends GlobalSettings {

  override def onLoadConfig(config: Configuration, path: File, classloader: ClassLoader, mode: Mode.Mode): Configuration = {

    val specificConfig:Config =  // ... Use the mode param to load appropriate file        

    super.onLoadConfig(specificConfig, path, classloader, mode)
  }
  ...
}
然后,您可以拥有包含适当值的适当命名文件(
dev.conf
production.conf
spring-mind),其中一个文件是资产控制器要使用的基本路径

编辑结果表明,这样做会使
路线中的使用变得笨拙,这里有另一种方法:

这种方法不针对每个环境使用配置文件,这意味着如果前端配置发生变化(例如,
/public
不再提供该配置),则必须更改此代码并重新部署它。但是,它非常适合Play 2.x:

package controllers

object EnvironmentSpecificAssets extends AssetsBuilder {

  val modeToAssetsPathMap = Map(
    Mode.Dev -> "/app/assets/ui",
    Mode.Prod -> "/public")

  lazy val modePath = modeToAssetsPathMap(Play.current.mode)

  /** New single-argument `at`, determines its path from the current app mode */
  def at(file:String): Action[AnyContent] = at(modePath, file)
}
代码是非常不言自明的,唯一的“技巧”可能是
lazy val
,这意味着我们只需要评估当前的操作模式并执行一次映射查找

现在,您的
路由
文件如下所示:

GET   /assets/*file     controllers.EnvironmentSpecificAssets.at(file)

谢谢你,这现在是有意义的,我不知道在Play2.x中不再支持条件句。请详细说明我如何将基本路径合并到我的资产控制器中?我的流动资产控制员如下所示<代码>包控制器。公共对象资产扩展控制器。资产生成器
谢谢这正是我需要的。
GET   /assets/*file     controllers.EnvironmentSpecificAssets.at(file)