1

I often find myself switching to a specific version of a package installed with homebrew when switching projects.

$ cd ~/Desktop/projects/project1
$ brew switch phantomjs 2.0.0
Cleaning /usr/local/Cellar/phantomjs/1.9.7_1
Cleaning /usr/local/Cellar/phantomjs/1.9.8
Cleaning /usr/local/Cellar/phantomjs/2.0.0
2 links created for /usr/local/Cellar/phantomjs/2.0.0

And then when changing project:

$ cd ~/Desktop/projects/project2
$ brew switch phantomjs 1.9.8
Cleaning /usr/local/Cellar/phantomjs/1.9.7_1
Cleaning /usr/local/Cellar/phantomjs/1.9.8
Cleaning /usr/local/Cellar/phantomjs/2.0.0
2 links created for /usr/local/Cellar/phantomjs/1.9.8

Is it somehow possible to automate this so that I can force brew to automatically switch to a specified version when inside a certain project?

Would be nice if one could create a file called something like .homebrewinside the target directory and from there specify required packages and versions.

1 Answer 1

1

To directly answer your question: take a look at ondir. I have not personally used it, but it appears to fit your use case.

ondir is a small program to automate tasks specific to certain directories. It works by executing scripts in directories when you enter and leave them.

To ruminate for a moment, though...

Swapping out package versions on enter/exit of dirs via the shell is, well, risky for a variety of reasons. (For starters, think about two terminal sessions, each in their own dir.)

What you're asking for (per-dir homebrew config) is effectively a virtual machine or container, since it goes beyond "virtualizing" a language (ex: Ruby via rbenv, Python via virtualenv`) and instead is for all system packages. You should consider setting up a Vagrant box for your projects to properly isolate them from your Mac and manage your dependencies better.

Anyway, back to your problem at hand...

PhantomJS is a standalone tool that happens to be helpfully available as a statically linked binary. We can use this to our advantage. Instead of swapping PhantomJS versions via brew switch, just download each statically linked version, stick the binary in ~/bin, name it appropriately (e.g. phantomjs-1.9.8), and adjust your scripts to call the desired version. If you can't adjust the scripts, you'll need to devise another scheme (project-specific symlinks, etc.)

Or, as suggested in your query on GitHub, you could also adjust your PATH, either via ondir or a wrapping script around whatever drives phantomjs.

(Yes, for the second time in one night I pointed someone to a tool I have not personally used.)

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .