在Play 2.1應用程序中,適合存儲私人資產的地方在哪裏?Play中的私人資產2.1
「私人資產」是指應用程序使用但用戶無法訪問的數據文件。
例如,如果我有一個文本文件(Foo.json
),其中包含每次應用程序啓動時解析的示例數據,那麼項目中的適當目錄將存儲它?
Foo.json
需要包含在部署中,並且需要從開發和生產中的代碼統一訪問。
在Play 2.1應用程序中,適合存儲私人資產的地方在哪裏?Play中的私人資產2.1
「私人資產」是指應用程序使用但用戶無法訪問的數據文件。
例如,如果我有一個文本文件(Foo.json
),其中包含每次應用程序啓動時解析的示例數據,那麼項目中的適當目錄將存儲它?
Foo.json
需要包含在部署中,並且需要從開發和生產中的代碼統一訪問。
一些選項:
conf
文件夾。即:conf/privatefiles/Foo.json
application.conf
路徑到文件系統的外部文件夾(完整路徑),在這種情況下,您可以輕鬆編輯內容而無需重新部署應用程序:/home/scrapdog/privatefiles/Foo.json
在所有情況下,請考慮使用內存緩存,以避免每次需要時從文件系統/數據庫讀取它。
我只是在應用程序根目錄下使用名爲data
的文件夾。您可以使用您想要的或更好的名稱,將實際名稱存儲在配置文件中。
要解決它的路徑,我用下面的代碼片段:
lazy val rootPath = {
import play.api.Play.current
play.api.Play.application.path.getPath
}
lazy val dataPath = rootPath + "/data/"
這是要在生產中工作嗎?即當我構建dist或部署到heroku時,它會將此目錄打包到jar中嗎? – kes 2013-02-25 19:37:29
不,它不會被打包在你的Jar文件中。您應該使用@biesior提到的第一個選項(將您的文件放在conf文件夾中)。 – 2013-02-25 21:04:47
@scrapdog我只是使用'git'來部署生產服務器上的所有東西。如果將來我需要構建一個jar文件,我會將數據文件移動到資源目錄中,並使用諸如Assembly或Proguard之類的sbt插件。 – paradigmatic 2013-02-26 07:59:36
你可以做我做什麼,我得到的答案從@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)
我現在正在努力解決類似的部署問題,我非常有興趣聽到社區對此有何評論 – 2013-02-25 17:14:00