elixirphoenix-frameworkedeliverdistillery

Read files in Phoenix in production mode


I've Phoenix app (I created it with --api flag) that has some additional data required to process requests that I store in priv/data/filters.csv.

So it works fine in dev mode, I can read this file like: File.stream!("priv/data/filters.csv"), but once app is delivered using mix edeliver update this file is not accessible anymore.

I can see this folder in build directory, but after app is delivered there is no such folder priv. I'm not sure why it's not copied to deliver folder.

What I'm doing wrong? Do I need to copy these files after deliver process? Where can I store my files that I have to use in prod mode?


Solution

  • You should use :code.priv_dir/1 to get the absolute path to the priv directory of your application at runtime. This will work with Erlang releases created by e.g. Distillery:

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

    For me, after doing MIX_ENV=prod mix release, the file priv/foo is copied to _build/prod/lib/my_app/priv/foo.