jetify-com / devbox

Instant, easy, and predictable development environments
https://www.jetify.com/devbox/
Apache License 2.0
8.79k stars 204 forks source link

On Mac ASDF shims path still has precedence #401

Closed mindreframer closed 1 year ago

mindreframer commented 1 year ago

Hello, this is not high prio, I was just testing devbox to see if it fits my workflow. It seem ASDF is causing troubles in the paths...

Before entering shell

$ echo $PATH
/Users/roman/.asdf/shims /Users/roman/.asdf/bin /opt/homebrew/bin /opt/homebrew/sbin /Users/roman/.nix-profile/bin /nix/var/nix/profiles/default/bin /opt/homebrew/opt/bison/bin /opt/homebrew/opt/flex/bin /Users/roman/.yarn/bin /usr/local/bin /usr/bin /bin /usr/sbin /sbin /Library/Apple/usr/bin /Library/Frameworks/EdgeDB.framework/bin /Applications/Wireshark.app/Contents/MacOS /Users/roman/.deno/bin /Users/roman/bin/yt-dlp_macos /Applications/calibre.app/Contents/MacOS /Users/roman/.pub-cache/bin /Users/roman/.asdf/installs/flutter/3.0.0-stable/.pub-cache/bin /Users/roman/.asdf/installs/golang/1.18.1/packages/bin

after entering shell

$ echo $PATH
/Users/roman/.asdf/shims /Users/roman/.asdf/bin /opt/homebrew/bin /opt/homebrew/sbin /opt/homebrew/opt/bison/bin /opt/homebrew/opt/flex/bin /Users/roman/.yarn/bin /nix/store/kvrd49dfkadaw6iik004pdyrjrvy9fm7-bash-interactive-5.1-p16/bin /nix/store/ns32408gw33gfjvkgnrfbv2h3l0vnzd6-python3-3.10.8/bin /nix/store/2wsfz0sp2w0z28b2pz76218s52rkwwaj-elixir-1.14.2/bin /nix/store/49wn01k9yikhjlxc1ym5b6civ29zz3gv-bash-5.1-p16/bin /nix/store/lqiqj6s5jx196bpx0mr53d232b57y768-clang-wrapper-11.1.0/bin /nix/store/kn8ahinf4kbh9zwnw44a0hhps6ia1swy-clang-11.1.0/bin /nix/store/v8y9sd43ygc27x4808asaymbk5nn4ild-coreutils-9.1/bin /nix/store/33yb640sh8ac5ky9ak7fjnrb3mw559q1-cctools-binutils-darwin-wrapper-973.0.1/bin /nix/store/x0b1kda81p0w0qqp7abvsprcf7s7qp64-cctools-binutils-darwin-973.0.1/bin /nix/store/v8y9sd43ygc27x4808asaymbk5nn4ild-coreutils-9.1/bin /nix/store/kcg2s3q8fqslprb4567v4zmd9l7jxclb-findutils-4.9.0/bin /nix/store/v9rpags3ciy01rxpslxpq0qcvaxy2gf6-diffutils-3.8/bin /nix/store/v6ihvpa7b1mj58sbimfqyrg205mrd7xv-gnused-4.8/bin /nix/store/nran2s5ihfjmpvhf832dqz3msr73hbhc-gnugrep-3.7/bin /nix/store/bxcw00s9cn6amc77g7jsciiyidmd74ip-gawk-5.1.1/bin /nix/store/l7rgxzafcscmnd7j1cc3rzz5iia7b91a-gnutar-1.34/bin /nix/store/ahzz1clw7sf1lxa83m4n4zfisx4ahxp9-gzip-1.12/bin /nix/store/hldrf5kdydn658lgr07iv6sajbnbpza0-bzip2-1.0.8-bin/bin /nix/store/j5lfwqj55ssxk02jhmi9hf0wib1ig4la-gnumake-4.3/bin /nix/store/49wn01k9yikhjlxc1ym5b6civ29zz3gv-bash-5.1-p16/bin /nix/store/4qqdkpdzkj3y3vsjjs3f170xy5rdjjwh-patch-2.7.6/bin /nix/store/502ln1c4zr5r0xr457jf4igrc36i1scm-xz-5.2.7-bin/bin /nix/store/0fvf2dkgw2clm0zgj0g6arr4mm3l9h3k-file-5.43/bin /opt/homebrew/bin /opt/homebrew/sbin /nix/var/nix/profiles/default/bin /usr/local/bin /usr/bin /bin /usr/sbin /sbin /Library/Apple/usr/bin /Library/Frameworks/EdgeDB.framework/bin /Applications/Wireshark.app/Contents/MacOS /Users/roman/.deno/bin /Users/roman/bin/yt-dlp_macos /Applications/calibre.app/Contents/MacOS /Users/roman/.pub-cache/bin /Users/roman/.asdf/installs/flutter/3.0.0-stable/.pub-cache/bin /Users/roman/.asdf/installs/golang/1.18.1/packages/bin /Users/roman/.deno/bin /Users/roman/bin/yt-dlp_macos /Applications/calibre.app/Contents/MacOS /Users/roman/.pub-cache/bin /Users/roman/.asdf/installs/flutter/3.0.0-stable/.pub-cache/bin /Users/roman/.asdf/installs/golang/1.18.1/packages/bin

I am using Fish shell.

$ fish --version
fish, version 3.5.1
$ devbox version
0.2.0
$ nix --version
nix (Nix) 2.11.1

Wish you good holidays and merry Christmas! 🌟

Lagoja commented 1 year ago

Hey @mindreframer, hope you're having a great holiday as well!

I think this may relate to a known issue where a few shells (including Fish) fail to correctly configure the PATH and init_hooks when running devbox shell. We're working on a few fixes:

  1. For Fish, we are investigating a way to add support by setting the path + hooks in Bash, and then starting Fish. This should allow Fish to inherit the environment from Bash.

  2. For other non-supported shells, we will default to Bash when starting devbox shell

I'll make sure to test with asdf after we implement these fixes to verify that it works

mindreframer commented 1 year ago

Hey @Lagoja !

Thanks for the super-quick response and the proposed plan sounds solid! Will be waiting for the fixes. 👍

ipince commented 1 year ago

Hi @mindreframer

Is there a specific problem that you're seeing with the given paths, or something that you expected to work differently?

My understanding is that this is working as expected. What's happening is the following:

This results in (1) seeing pre-pended stuff in the front, and (2) seeing repeated paths, from the last run of your init file (config.fish), and from what was in your original $PATH.

Now, your particular case is somewhat weird, because some paths are duplicated and some aren't (the asdf ones in front). I suspect that the logic in config.fish that adds those paths is smart enough to not repeat them if they already exist in PATH, but rather just bring them to the front. That's just a guess though; it's hard to tell what's going on without seeing what's in config.fish.

Anyway, all of this results in an ugly-looking path, but ultimately everything defined your devbox.json should be in path, and you should also have access to other things from your machine to make developing easy, which is the way devbox shell is intended to work. Please let me know if I'm misunderstanding or missing something.

derekr commented 1 year ago

I think I'm having a similar issue using fish. Specifically testing out postgresql and the initdb command prefers my original homebrew installation of postgresql.

devbox init
devbox add postgresql
devbox shell
initdb
initdb: error: The program "postgres" is needed by initdb but was not found in the
same directory as "/opt/homebrew/Cellar/libpq/14.5/bin/initdb".
Check your installation.
{
  "packages": [
    "postgresql"
  ],
  "shell": {
    "init_hook": null
  },
  "nixpkgs": {
    "commit": "f80ac848e3d6f0c12c52758c0f25c10c97ca3b62"
  }
}

regular shell

/Users/drk/.turso /Users/drk/Downloads/google-cloud-sdk 3/bin /Users/drk/Library/pnpm /Users/drk/.nix-profile/bin /nix/var/nix/profiles/default/bin /Users/drk/go/bin /Users/drk/Library/Caches/fnm_multishells/37016_1675466726029/bin /opt/homebrew/opt/openjdk/bin /Users/drk/.local/bin /Users/drk/.cargo/bin /opt/homebrew/opt/openssl@3/bin /opt/homebrew/opt/libpq/bin /opt/homebrew/bin /usr/local/bin /System/Cryptexes/App/usr/bin /usr/bin /bin /usr/sbin /sbin /Library/Apple/usr/bin /usr/local/go/bin /Users/drk/.deno/bin

devbox shell

/Users/drk/.turso /Users/drk/Library/pnpm /Users/drk/go/bin /Users/drk/Library/Caches/fnm_multishells/40548_1675467213183/bin /opt/homebrew/opt/openjdk/bin /Users/drk/.local/bin /Users/drk/.cargo/bin /opt/homebrew/opt/openssl@3/bin /opt/homebrew/opt/libpq/bin /opt/homebrew/bin /nix/store/yigicnz7r2znh1fq2l184svkb3h4v90g-bash-interactive-5.1-p16/bin /nix/store/y2dfv0jf61pgwgkc9rfq7kjabshpwqra-postgresql-14.6/bin /nix/store/bwscr98440mhhlg556fqhp5ll2fxnfic-clang-wrapper-11.1.0/bin /nix/store/ssfpjhrysqf6ywz5sqi8gpz28zc23kiy-clang-11.1.0/bin /nix/store/gvl9w6c5q83nd4svz5v5hqhgfzlcpl3y-coreutils-9.1/bin /nix/store/xh503dqb1yb5w9mjziclp81gi4cqmwf6-cctools-binutils-darwin-wrapper-973.0.1/bin /nix/store/a17dwfwqj5ry734zfv3k1f5n37s4wxns-cctools-binutils-darwin-973.0.1/bin /nix/store/gvl9w6c5q83nd4svz5v5hqhgfzlcpl3y-coreutils-9.1/bin /nix/store/x080znwmkginz9xb1qchm5dd188m59hg-findutils-4.9.0/bin /nix/store/pnp0lkyjhrhl7vj0fgrpx80zzzmnkqi6-diffutils-3.8/bin /nix/store/vjnvxrpi26aigy96fvcfwjx5y5j18h7r-gnused-4.9/bin /nix/store/8j799mid9ai29hg4s4xifx3yn1x1qply-gnugrep-3.7/bin /nix/store/40sbwcrzl80vrlz9wwdml69b6y224kbs-gawk-5.2.1/bin /nix/store/wmybxxsdc4h640xgzijmqi1yic3fvs6x-gnutar-1.34/bin /nix/store/3x74r0m2833bqr7krjf4q8q2wpb5l3v7-gzip-1.12/bin /nix/store/8wdl82qvvd6hkq361vq8cmi110g3pbvg-bzip2-1.0.8-bin/bin /nix/store/6lkc7zwfkr21si1g85mq39mmlpf6mn35-gnumake-4.4/bin /nix/store/n0k8njvgg6yjapkl81rm821s9vx0qrwb-bash-5.2-p15/bin /nix/store/m5dhzr6yzq199ahyiv3xqpiy4japhr9f-patch-2.7.6/bin /nix/store/dd4776lwwki6dxrjn2cli3sc9mwmdxp5-xz-5.4.0-bin/bin /nix/store/4zhg5g546pa5gprszifqz1lx9vg8h8nv-file-5.43/bin /Users/drk/.turso /Users/drk/Downloads/google-cloud-sdk 3/bin /Users/drk/Library/pnpm /nix/var/nix/profiles/default/bin /Users/drk/go/bin /Users/drk/Library/Caches/fnm_multishells/37016_1675466726029/bin /usr/local/bin /System/Cryptexes/App/usr/bin /usr/bin /bin /usr/sbin /sbin /Library/Apple/usr/bin /usr/local/go/bin /Users/drk/.deno/bin /Users/drk/.deno/bin
amok commented 1 year ago

Hi, @mindreframer I was also having a similar issue with nix+fish, so far I managed to fix it with a dirty hack, by adding the following into my config.fish

# When `nix shell` / `nix develop` is called then asdf or ~/.nix-profile binaries
# takes precedence over the "nix-shell" binaries. This function fixes the order of
# the PATH variable so that the "nix-shell" binaries are first in the PATH.
function fix_nix_paths_order
    set -l non_nix_paths ''
    set -l nix_user_paths ''
    set -l nix_shell_paths ''

    for path in (echo $PATH | string split ' ')
        if string match -q "/nix/store/*" $path
            set -p nix_shell_paths $path
        else if string match -q "*/.nix-profile/bin" $path
            set -p nix_user_paths $path
        else
            set -p non_nix_paths $path
        end
    end

    set -l non_nix_paths (string trim "$non_nix_paths")
    set -l nix_user_paths (string trim "$nix_user_paths")
    set -l nix_shell_paths (string trim "$nix_shell_paths")

    for p in (echo "$non_nix_paths $nix_user_paths $nix_shell_paths" | string split ' ')
        set -l path (string trim $p)
        if test -n "$path"
            fish_add_path -m $path
        end
    end
end

fix_nix_paths_order
ipince commented 1 year ago

Thanks for the workaround @amok !

Btw, I have a PR out (#669) that should fix this issue.

mindreframer commented 1 year ago

@mindreframer thanks, this looks interesting! I will let the dust settle on this, since for now I manage my local setup the old fashioned way. ;)

derekr commented 1 year ago

Working for me w/ new version! Thank you :D

ipince commented 1 year ago

Great, thanks for confirming!