I do a lot of Python work, and I’m a huge fan of virtualenv, which allows you to set up a completely isolated Python environment. This is hugely helpful to keep various dependencies from multiple projects from clobbering one another. It’s so helpful, that when I work in pretty much any other language, I miss having the ability to isolate things so nicely.
In fact there are several ways such things, but my favorite by far is a project called nodeenv. It’s written in Python, which might seem a bit strange until you realize that it’s written specifically to integrate nicely with virtualenv.
Here’s how you use it. Or at least how I use it.
First create a virtualenv. Here I’m using virtualenvwrapper, but of course you can use vanilla virtualenv if you prefer:
$ mkproject nodeenv-test New python executable in nodeenv-test/bin/python Installing setuptools............done. Installing pip...............done. Creating /home/funsize/code/nodeenv-test Setting project for nodeenv-test to /home/funsize/code/nodeenv-test
This will create a project directory, create a virtualenv, install pip into the virtualenv, activate it, and switch my current working directory to the project directory just created.
Now we install nodeenv into the virtualenv:
$ pip install nodeenv
This installs a command called, unsurprisingly, "nodeenv", which we now run with the -p flag, which tells it to integrate with the current python virtualenv:
$ nodenv -p * Install node.js (0.10.26) ... done. * Appending nodeenv settings to /home/funsize/.virtualenvs/nodeenv-test/bin/activate
Everything will probably work fine at this point, but just to be safe, I like to reset the virtualenv by deactivating and reactivating it:
$ deactivate $ workon nodeenv-test
(Again, I’m using virtualenvwrapper, which may or may not be to your taste).
At this point we are working in an isolated environment for both Python and Node.js. I can install libraries for Python using pip, or for Node using npm -g and they will not interact with my system Python libraries or Node libraries in any way. Some of you may recall that I’m a big fan of bower, so I can install it like so:
$ npm install -g bower
Bower has a bunch of dependencies, which npm takes care of for us, and all of those get installed into our isolated environment. They can’t interfere with any of our other projects in any way. Bliss!
Ok, so it’s not quite all sunshine and roses. nodeenv needs a bunch of dependencies to work, though nothing too outlandish (stuff like a C compiler, curl, etc.). This isn’t too onerous, and anyone who can install software packages on their machine should be able to get it working on pretty much any Unix flavor without too much trouble. I have not, much to my disappointment, been able to get it to work on Windows as of yet, even with all of the relevant dependencies installed. It appears to have something to do with the way Windows handles command parsing and/or escaping. If anyone out there has gotten it running on Windows, please let me know in the comments. With those caveats, though, nodeenv really is pretty fantastic.
Now this is the kind of thing that you may not really appreciate until you use it, so I encourage all of you out there to give this a shot. It really is worth your time. Enjoy!