2014-02-25 29 views
2

无法访问生产中的编译资产位置。Play Framework 2.2.x:静态资产位置在生产中不起作用

我的策略一直以服务于“应用程序/资产/ UI”我的资产在开发时与“公”时,在生产中为我的conf /路线图所示,这是做文件

#{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) 
#{/} 

由于我已经定义外资产映射“公共”,我已经添加了以下行我Build.scala

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

作为我的脚本加载conditionaly取决于环境的示例如下所示

@if(play.Play.isDev()) {<script src="@routes.Assets.at("/app/assets/ui", "javascripts/application.js")"type="text/javascript"></script>} else {<script src="@.routes.Assets.at("/public", "javascripts/application.min.js")" type="text/javascript"></script>} 

我为我的前端工作流程使用Grunt,当应用程序构建它时,它会将分发文件复制到应用程序的公用文件夹中。 我使用"sbt clean compile stage"开始生产应用程序,然后运行打包的应用程序。

我的问题似乎是,路线仍然是指“app/assets/ui”文件夹,而不是分发“公共”文件夹。

关于如何调试的任何提示?我的工作背景是作为一名前端开发人员,所以我非常喜欢Play!和斯卡拉。

回答

1

正如@estmatic提到的那样,您的条件在routes将不被评估。

由于这是通常是非常有用的,以巩固Mode s转换文件的应用程序之间的区别,我建议你延长GlobalSettings(如果你没有的话),并覆盖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.confproduction.conf),其中包含合适的值,其中之一是Assets控制器要使用的基地path

编辑原来做这种方式使得使用在routes尴尬,这里的另一种方法:

这种方法不使用每个环境中的配置文件,这意味着如果某事在前端配置更改(例如,它不再从/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这意味着我们只需要评估当前的操作模式,做地图查询一次。

现在你routes文件看起来就像这样:

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

谢谢你这现在是有道理的,我不知道在条件句玩2.x版本中不再支持请您详细说明我可以如何将基本路径合并到我的资产管理器中?我目前的资产控制器如下所示。 'packages controllers.common object Assets extends controllers.AssetsBuilder' –

+0

谢谢,这正是我所需要的。 –

0

Playframework 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)