2014-02-25 27 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)