Skip to content

Instantly share code, notes, and snippets.

@meffie
Created April 4, 2023 18:00
Show Gist options
  • Save meffie/4f2d1b4ab1d9856cb7d887591c969ba2 to your computer and use it in GitHub Desktop.
Save meffie/4f2d1b4ab1d9856cb7d887591c969ba2 to your computer and use it in GitHub Desktop.
Using direnv for project specific program versions
We have 2 versions of program foo in /usr/bin/. We want to use foo-v1 in
project_a and foo-v2 in project_b.
$ foo-v1
This is version 1
I am located at /usr/bin/foo-v1
$ foo-v2
This is version 2
I am located at /usr/bin/foo-v2
First create project_a. Create a project specific hidden directory in project
a and put a symlink to the foo version we want to use in this project.
$ mkdir project_a
$ cd project_a
$ mkdir -p .direnv/bin
$ ln -s /usr/bin/foo-v1 .direnv/bin/foo
Create a .envrc file. Specify the PATH_add function to prepend .direnv/bin to
the PATH when in project_a.
$ echo "PATH_add .direnv/bin" >>.envrc
$ direnv allow
direnv: loading ~/project_a/.envrc
direnv: export ~PATH
# Now, foo resolves to foo-v1 when you cd to project_a (or any subdir of project_a)
$ cd
$ cd project_a
direnv: loading ~/project_a/.envrc
direnv: export ~PATH
$ foo
This is version 1
I am located at /home/mmeffie/project_a/.direnv/bin/foo
Now create project_b, where foo will resolve to foo-v2.
$ mkdir project_b
$ cd project_b
$ mkdir -p .direnv/bin
$ ln -s /usr/bin/foo-v2 .direnv/bin/foo
$ echo "PATH_add .direnv/bin" >>.envrc
$ direnv allow
direnv: loading ~/project_a/.envrc
direnv: export ~PATH
$ foo
This is version 2
I am located at /usr/bin/foo-v2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment