I’ve been using File.cwd! in an elixir project happily in order to load a file relative to the project’s root. I’ve added this project as a dependency to another app, and it was working fine on digital ocean, but broke on Heroku.
I’ve tried my best to debug, but I can’t find the proper alternative.
The code is simply File.cwd! joined with path components, and I run this code in the init of a GenServer worker.
On Heroku, I noticed that using @symbol returns a path like so: /tmp/build_[...]/deps/dama_logic/vendor/pyport/driver.py
But, by the time the init is invoked, and I run File.cwd! directly, I get the root project folder! Notice, dama_logic is the subproject name, and I need to load files relative to it.
Also please note, the directory returned from the symbol no longer exists after the project is built.
The only solution I can think of is using File.cwd as a symbol, and then replacing the top level path with the new path relative the the project instead of the temp directory.
At least this way, I can “make use” of the deps path.
In general the only reliable way to accessing resources at runtime is putting them in the priv directory and accessing with Application.app_path(app, "priv/path/to/file"). This is a convention understood by all tools, which makes it “just work”.
Small nitpick:
The correct function seems to be Application.app_dir.
Also, I never knew Elixir had such magic directories. I just created priv, added a dummy file there, and all of a sudden, it was copied along side the built app. Very useful, but also implicit.
It is part of the old erlang eco-system, not really implicit, it is documented all over in Erlang and all calls to it do tend to have priv in the name somewhere.