How to make a module reload when changed?

I have a phoenix project on Elixir 1.4.2, which loads a package with path: like following:

defp deps do
  [
    {:a_package, path: "../../a_package", runtime: false},
  ]

The package has several files. When I modify a file in the package, is there any way to make the phoenix project reload it, not only with reloading the phoenix but also reloads it automatically?

Dependencies are expected to be static, so that is definitely not a usual use-case. ^.^

You ‘might’ be able to be changing the watched paths for the phoenix reloader to that path as well, but that reloader only does the equivalent of calling mix compile I think, which will not recompile a dependency automatically either.

You could make it an umbrella project and make both parts of the umbrella?

Maybe others have ideas too?

Make an alias which updates that dep, recompiles it and then compiles your project.

Would not work for auto-reloading I think, that still requires it to be manually done?

I haven’t seen the requirement of auto reload. Afaik that’s only possible under an umbrella.

1 Like

I’m afraid but as the modules is used from several different phoenix projects, I cannot make it into the umbrella…

Is there any documents about how to configure phoenix reloader? I browsed Phoenix.CodeReloader, but I cannot found the way.

Then you are out of luck.

Even if you were able to change the pathes which are watched, only mix compile were called, but you need to call mix do deps.update $yourdep, deps.compile, compile. And even when you do the latter, I’m not even sure if that fresh compiled modules are reloaded then, or that of the app only. After compilation they live in different areas of your _build folder.

A dependency shouldn’t change that often, and if you change your dep more often than the core, then your dependency is propably not a dep, but your application in which case you should either integrate it or make it an umbrella.

2 Likes

This is old, but I am developing a package and it’s so annoying that I have to restart the Phoenix server each time I make a change in the package code.

I am having an hard time believing that when Jose, Chris and others from the core team have to develop a package, that they have to keep restarting the server to see the code changes applied.

So I am curious to know what is the workflow that package developers use in order to avoid this big annoyance?

I include the package like this:

{:utils_for, path: "./.dev-bench/utils_for"}

Take a look at LiveDashboard. It starts a phoenix server in the project itself for development.

1 Like

Thanks for the tip.

It seems to me that what you mention may be useful for developing the package in isolation, but I am developing it while using it for real in my application, that already has a running server.

I’ve made the umbrella app and then create a symlink from package directory to umbrella apps:
ln -s ~/Dev/my_package ~/Dev/my_demo_umbrella/apps/my_package

With this setup code reloading works somehow even without dependency in other apps mixfiles.