Where does mix look for rebar?

Here’s my rebar info:

/elixir_programs/friends$ which rebar
/usr/local/bin/rebar

~/elixir_programs/friends$ rebar --version
rebar 2.6.4 19 20170625_072305 git 2.6.4-6-g2a52f60

~/elixir_programs/friends$ which rebar3
/usr/local/bin/rebar3

~/elixir_programs/friends$ rebar3 --version
rebar 3.0.0-beta.4+build.3189.ref21ae314 on Erlang/OTP 20 Erts 9.3

And here’s what my PATH looks like:

$ ruby -e "puts ENV['PATH'].split ':'"
/Users/7stud/.asdf/shims
/Users/7stud/.asdf/bin
/Users/7stud/.rvm/gems/ruby-2.4.0/bin
/Users/7stud/.rvm/gems/ruby-2.4.0@global/bin
/Users/7stud/.rvm/rubies/ruby-2.4.0/bin
/opt/local/bin
/opt/local/sbin
/Library/Frameworks/Python.framework/Versions/3.6/bin
/Users/7stud/.evm/erlang_versions/otp_src_20.2/bin
/usr/local/mysql/bin
/usr/local/bin/mongodb-osx-x86_64-3.0.7/bin
/Users/7stud/.local/bin
/Users/7stud/perl5/perlbrew/bin
/Users/7stud/perl5/perlbrew/perls/perl-5.20.2/bin
/Users/7stud/.nvm/versions/node/v9.4.0/bin
/usr/local/bin
/Library/Frameworks/Python.framework/Versions/2.7/bin
/Library/Frameworks/Python.framework/Versions/3.4/bin
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/go/bin
/usr/local/MacGPG2/bin
/Applications/Wireshark.app/Contents/MacOS
/usr/local/git/bin
/usr/local/go/bin
//Users/7stud/go_programs/bin
/Applications/Rakudo/bin
/Applications/Rakudo/share/perl6/site/bin
/Users/7stud/.rvm/bin

I’m following the “Getting Started” tutorial for Ecto, and it says to issue this command:

 $ mix ecto.gen.repo -r Friends.Repo

Here’s what I get:

~/elixir_programs/friends$ mix ecto.gen.repo -r Friends.Repo
Could not find "rebar", which is needed to build dependency :poolboy
I can install a local copy which is just used by Mix
Shall I install rebar? (if running non-interactively, use "mix local.rebar --force") [Yn]

Why can’t mix find my rebar? Is it better practice to let mix install its own version of rebar?

Mix uses its own copy of rebar placed in $MIX_HOME/rebar and $MIX_HOME/rebar3, by default $MIX_HOME is ~/.mix. This is done, so that we can verify a concrete version of rebar works fine with mix and does not have any bugs - in case such bugs are discovered, it’s also easier to update. It removes one variable (version of rebar) when debugging issues with mix.

1 Like

Thanks for the response.

Then why does the mix output say

Based on what you are saying, the mix message should be:

Could not find Mix’s copy of rebar. Mix needs its own rebar. Should I install a local copy of rebar which is just used by Mix?