Scala Play Framework 2.2.x:静态资产位置在生产中不起作用
在生产中访问编译的资产位置时遇到问题 我的策略是在开发时在“app/assets/ui”中为我的资产提供服务,在生产时在“public”中为我的资产提供服务,如下面我的conf/routes文件所示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
#{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)