OS X package management, without sudo
Recently, I had to use a shared company MacBook for a web dev project. Knowing this shared device would only be mine for a few weeks, I wanted to be able to delete everything when I was done.
I created a new OS X user and started looking into how I could install Homebrew and npm for that user. In doing this I found that both package managers could now be used without sudo
. Here’s how.
Homebrew
Homebrew doesn’t normally require sudo permissions, but installs to /usr/local/bin
which won’t be deleted when the current user is deleted.
Installing Homebrew for the current user is as easy as cloning the repository and adding it’s bin
to your $PATH
. I chose to install it in ~/homebrew
, to do the same fire up a new shell in your home directory (or type cd
) and enter:
git clone https://github.com/Homebrew/homebrew
Next you need to add ~/homebrew/bin
to your $PATH
so you can use the brew
command, as well as anything else you choose to install with brew install
. The simplest way to do this is to add this line to the end of your ~/.bashrc
or ~/.zshrc
file:
export PATH="${HOME}/homebrew/bin"
You will need to start a new terminal session for the changes to take effect. After which you can test that it works by running brew update
and, for example, brew install tree
.
npm
npm is installed with Node.js, so if you followed the instructions to install Homebrew the easiest way to install both is:
brew install node
This installs npm to ~/homebrew/bin/npm
, however npm will still try to install global packages to /usr/local/bin
. You can change this behaviour by changing npm’s ‘prefix’ setting to a new folder in your home directory:
mkdir ~/npm-global
npm config set prefix "~/npm-global"
As with Homebrew, you need to add ~/npm-global/bin
to your $PATH
so any programs you install with npm install --global
can be found. The simplest way to do this is to add this line to the end of your ~/.bashrc
or ~/.zshrc
file:
export PATH="${HOME}/npm-global/bin"
Again, you will need to start a new terminal session for the changes to take effect. Test if npm works without sudo by running, for example, npm install -g vtop
.
Ruby
Installing Ruby gems is easier because it’s supported out of the box. To install for the current user only, use the --user-install
flag:
gem install jekyll --user-install
The gem command will warn you that the install directory in ~/.gem/ruby
is not in your $PATH
. The exact path you need to add depends on the Ruby version you have installed, but you will need add something like this to your ~/.bashrc
or ~/.zshrc
file:
export PATH="${HOME}/.gem/ruby/2.0.0/bin"
Desktop Applications
Finally, you can also install OS X apps per-user if you wish. By default, if you’re installing from a .dmg
the app will ask you to drag the program to /Applications
. Each OS X user also has a ~/Applications
folder in their home directory, simply dragging new apps there will install them for the current user only.