2013-02-25 66 views
4

在Play 2.1應用程序中,適合存儲私人資產的地方在哪裏?Play中的私人資產2.1

「私人資產」是指應用程序使用但用戶無法訪問的數據文件。

例如,如果我有一個文本文件(Foo.json),其中包含每次應用程序啓動時解析的示例數據,那麼項目中的適當目錄將存儲它?

Foo.json需要包含在部署中,並且需要從開發和生產中的代碼統一訪問。

+0

我現在正在努力解決類似的部署問題,我非常有興趣聽到社區對此有何評論 – 2013-02-25 17:14:00

回答

3

一些選項:

  1. 通常將文件轉移到conf文件夾。即:conf/privatefiles/Foo.json
  2. 如果它們經常發生變化,您可以考慮添加到application.conf路徑到文件系統的外部文件夾(完整路徑),在這種情況下,您可以輕鬆編輯內容而無需重新部署應用程序:/home/scrapdog/privatefiles/Foo.json
  3. 您也可以將它們存儲在數據庫中,好處與以前的選項相同 - 易於編輯。

在所有情況下,請考慮使用內存緩存,以避免每次需要時從文件系統/數據庫讀取它。

+0

謝謝。 #1是我唯一的選擇(因爲應用程序必須是獨立的)。如何從應用程序中統一訪問文件(在conf/private文件中)? – kes 2013-02-25 21:26:59

+0

#1雖然是一種很差的解決方案,因爲資產不一定是配置文件 – cdmckay 2014-01-17 20:45:00

+0

@cdmckay而OP要在應用程序啓動時解析文件只我假設這只是他自定義的方式來配置的東西... – biesior 2014-01-17 21:07:14

1

我只是在應用程序根目錄下使用名爲data的文件夾。您可以使用您想要的或更好的名稱,將實際名稱存儲在配置文件中。

要解決它的路徑,我用下面的代碼片段:

lazy val rootPath = { 
    import play.api.Play.current 
    play.api.Play.application.path.getPath 
    } 
    lazy val dataPath = rootPath + "/data/" 
+0

這是要在生產中工作嗎?即當我構建dist或部署到heroku時,它會將此目錄打包到jar中嗎? – kes 2013-02-25 19:37:29

+0

不,它不會被打包在你的Jar文件中。您應該使用@biesior提到的第一個選項(將您的文件放在conf文件夾中)。 – 2013-02-25 21:04:47

+0

@scrapdog我只是使用'git'來部署生產服務器上的所有東西。如果將來我需要構建一個jar文件,我會將數據文件移動到資源目錄中,並使用諸如Assembly或Proguard之類的sbt插件。 – paradigmatic 2013-02-26 07:59:36

1

你可以做我做什麼,我得到的答案從@Marius Soutier here。如果您喜歡,請在上面加上他的回答:

您可以將「內部」文檔放在conf文件夾中,這相當於標準sbt項目中的resources

基本上在conf下創建一個目錄,名爲json,要訪問它,您需要使用Play.resourceAsStream()。請注意,這會給你一個java.io.InputStream,因爲你的文件將成爲由activator dist創建的JAR的一部分。

我的例子是在視圖中使用它,但你可以根據需要修改它。

Play.resourceAsStream("json/Foo.json") map { inputStream => 
    Ok(views.html.xxx(XXX.do_something_with_stream(inputStream))) 
} getOrElse (InternalServerError) 

您還可以使用Play.resource(),這會給你一個java.net.URL,您可以使用getFile()得到java.io.File出來。

Play.resource("json/Foo.json") map { fileURL => 
    Ok(views.html.xxx(XXX.do_something_with_file(fileURL.getFile()))) 
} getOrElse (InternalServerError)