Чтение файлов в Фениксе в производственном режиме

У меня есть приложение Phoenix (я создал его с флагом --api), в котором есть некоторые дополнительные данные, необходимые для обработки запросов, которые я храню в priv/data/filters.csv,

Так что это прекрасно работает в dev режим, я могу прочитать этот файл как: File.stream!("priv/data/filters.csv"), но как только приложение доставлено с помощью mix edeliver update этот файл больше не доступен.

Я вижу эту папку в директории сборки, но после доставки приложения такой папки нет priv, Я не уверен, почему он не копируется для доставки папки.

Что я делаю не так? Нужно ли копировать эти файлы после доставки? Где я могу хранить свои файлы, которые я должен использовать в режиме Prod?

3 ответа

Решение

Вы должны использовать :code.priv_dir/1 чтобы получить абсолютный путь к priv каталог вашего приложения во время выполнения. Это будет работать с релизами Erlang, созданными, например, Distillery:

File.stream!(Path.join(:code.priv_dir(:my_app), "data/filters.csv"))

Для меня после выполнения MIX_ENV=prod mix release, файл priv/foo копируется в _build/prod/lib/my_app/priv/foo,

У меня была похожая проблема, и мне удалось решить ее с помощью Application.app_dir(my_app, "priv")

Вы должны проверить свою конфигурацию в lib/YOUR_APP/endpoint.ex, По умолчанию Plug.Static белые списки файлов, которые обслуживаются. Попробуйте добавить свои файлы на only: ~w(...) список.

Другие вопросы по тегам