Чтение файлов в Фениксе в производственном режиме
У меня есть приложение 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(...)
список.