trisolaran

trisolaran

Is there an elegant way to ensure that a Mix.Task is compiled only in a specific environment?

Hello everyone,

I wrote a Mix.Task that’s supposed to be run in a specific environment (:test) and nowhere else.
The task uses dependencies that are present only in the test environment.

I can set preferred_cli_env to make sure that the task automatically runs in the test environment when I invoke it, so that’s good.

However, when I compile my app in another environment (e.g. :dev) mix will try to compile that task, resulting in errors or at the very least compiler’s warnings due to the missing dependencies.

Is there an elegant way to solve this problem? I can think of a few options:

  • Make the test-only dependencies used by the task available in all environments
  • Enclose the code in my task in a huge if Mix.env() == :test do ... end clause
  • Split tasks into directories: (i.e. task/test, task/dev etc.) and play around with the elixirc_paths option to disable compilation in specific environments

The last option is the only one appealing to me, but I think elixirc_paths only accepts a list of directories, and since lib is already in there, the tasks would have be moved out of lib. I wish there was a way to selectively exclude a directory, or even better a single file, but I believe that’s not possible.

Any ideas? Thank you very much in advance! :slight_smile:

Marked As Solved

dimitarvp

dimitarvp

You can always wrap the entire module code? :man_shrugging:t3:

if Mix.env() == :dev do

defmodule XYZ do
  # ...
end

end

Also Liked

josevalim

josevalim

Creator of Elixir

This should work. Elixir generally does not care which files define a module.

LostKobrakai

LostKobrakai

Option 4: Make the mix task not fail in other envs by just printing an error message instead of doing what it normally does.

Where Next?

Popular in Questions Top

jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
sergio
In Ruby, I can go: User.find_by(email: "foobar@email.com").update(email: "hello@email.com") How can I do something similar in Elixir? ...
New
ycv005
I have followed this StackOverflow post to install the specific version of Erlang. And When I am running mix ecto.setup then getting fol...
New
lk-geimfari
What is most correct way to open, read and parse JSON file with poison? For example if we have example.json file in root of some projec...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
qwerescape
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
LegitStack
I’m trying to make a websocket server in Phoenix or raw Elixir. I heard about gun, I think I could use cowboy, but since I’m not that sma...
New
baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
Patoshizzle
After calling mix ecto.create I get this error: 17:00:32.162 [error] GenServer #PID<0.412.0> terminating ** (Postgrex.Error) FATAL...
New

Other popular topics Top

dotdotdotPaul
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
axelson
This post is a wiki (feel free to hit the edit button near the bottom right of this post to add your own changes!) This post collects co...
239 45766 226
New
malloryerik
Hi, this is for people who, like me, have had some friction using .html.heex templates in VSCode. The solution seems to be, in a hyphena...
New
chrismccord
As promised, the first release candidate of Phoenix 1.3.0 is out! This release focuses on code generators with improved project structure...
New
qwerescape
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
johnnyicon
Hi all, I've just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I'm trying to use Postg...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New

We're in Beta

About us Mission Statement