Частные активы в Play 2.1

Где в приложении Play 2.1 лучше всего хранить личные активы?

Под «частным активом» я подразумеваю файл данных, который используется приложением, но недоступен для пользователя.

Например, если у меня есть текстовый файл (Foo.json), содержащий образцы данных, которые анализируются каждый раз при запуске приложения, в каком каталоге проекта они будут храниться?

Foo.json необходимо включить в развертывание и обеспечить единообразный доступ из кода как при разработке, так и при производстве.


person kes    schedule 25.02.2013    source источник
comment
Я сейчас борюсь с подобными вопросами по развертыванию, и мне очень интересно услышать, что сообщество скажет по этому поводу.   -  person Ian McMahon    schedule 25.02.2013


Ответы (3)


Некоторые варианты:

  1. Обычно файлы попадают в папку conf. то есть: conf/privatefiles/Foo.json
  2. Если они часто меняются, вы можете добавить в свой application.conf путь к внешней папке где-нибудь в файловой системе (полный путь), в таком случае вы сможете легко редактировать содержимое без повторного развертывания приложений: /home/scrapdog/privatefiles/Foo.json
  3. Вы также можете сохранить их в базе данных, преимущества такие же, как и в предыдущем варианте - простое редактирование.

Во всех случаях рассмотрите возможность использования кеша памяти, чтобы избежать чтения его из файловой системы / базы данных каждый раз, когда это необходимо.

person biesior    schedule 25.02.2013
comment
Спасибо. №1 - единственный вариант для меня (поскольку приложение должно быть автономным). Как мне обеспечить единообразный доступ к файлам (в conf / privatefiles) из приложения? - person kes; 26.02.2013
comment
# 1 - плохое решение, поскольку активы не обязательно файлы конфигурации. - person cdmckay; 18.01.2014
comment
@cdmckay, в то время как OP хочет проанализировать файл только при запуске приложения, я предполагаю, что это просто его собственный способ что-то настроить ... - person biesior; 18.01.2014
comment
Так будет ли что-то вроде app/assets работать нормально и быть упакованным? - person cdmckay; 18.01.2014

Я просто использую папку с именем data в корне приложения. Вы можете использовать желаемое имя или, лучше, сохранить фактическое имя в файле конфигурации.

Чтобы разрешить его путь, я использую следующий фрагмент:

  lazy val rootPath = {
    import play.api.Play.current
    play.api.Play.application.path.getPath
  }
  lazy val dataPath = rootPath + "/data/"
person paradigmatic    schedule 25.02.2013
comment
Будет ли это работать в продакшене? то есть будет ли он упаковать этот каталог в банку, когда я создам dist или разверну на heroku? - person kes; 25.02.2013
comment
Нет, он не будет упакован в ваш файл Jar. Вам следует выбрать первый вариант, упомянутый @biesior (поместите свои файлы в папку conf). - person ndeverge; 26.02.2013
comment
@scrapdog Я просто использую git для развертывания всего на рабочем сервере. Если в будущем мне нужно будет создать одну банку, я бы переместил файл данных в каталог ресурсов и использовал плагин sbt, такой как Assembly или Proguard. - person paradigmatic; 26.02.2013

Вы можете сделать то же, что и я, я получил ответ от @Marius Soutier здесь. Пожалуйста, проголосуйте за его ответ, если он вам нравится:

Вы можете поместить «внутренние» документы в папку conf, это эквивалент resources в стандартных проектах sbt.

Обычно создайте в conf каталог с именем json и для доступа к нему используйте Play.resourceAsStream(). Обратите внимание, что это дает вам java.io.InputStream, потому что ваш файл будет частью JAR, созданного activator dist.

В моем примере он используется в представлении, но вы можете изменить его по своему усмотрению.

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)
person DavidG    schedule 07.10.2014