summaryrefslogtreecommitdiff
path: root/posts/2012-10-31-virtualenv-and-checkouts.org
blob: 40e37cc93b252da2cc029933e4d63573e8e6b713 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
I've started to do some Clojure in my spare time. The default tool
adopted by the community to manage projects is
[[http://leiningen.org][leiningen]]. For those of you who don't know
what =lein= is, it's a tool to automate your Clojure project: it will
boostrap a new project, install the dependencies, and there's a plugin
mechanism to extend the default possibilities of the tool.

One of the nice feature of the tool is the *checkouts* directory. From
the
[[https://github.com/technomancy/leiningen/blob/preview/doc/FAQ.md][FAQ]]:

#+BEGIN_QUOTE
  If you create a directory named checkouts in your project root and
  symlink some other project roots into it, Leiningen will allow you to
  hack on them in parallel.
#+END_QUOTE

For Python projects at [[http://www.saymedia.com/careers][$work]] I use
[[http://virtualenvwrapper.readthedocs.org/en/latest/][virtualenvwrapper]]
to easily work on them without having to deal with conflicting
dependencies. When I need to change a library that is used by one of the
project, usually I go to the virtualenv directory and create a symlink
so it uses the one I'm editing.

What I really want is a mechanism similar to =lein=, where I can have a
*checkouts/* directory inside the main project, where I can clone a
library or create a symlink. Since =virtualenvwrapper= provides a hook
mechanism, I wrote a small hook inside *~/.virtualenvs/postactivate*:

#+BEGIN_SRC sh
    #!/bin/bash

    # move to the directory of the project
    proj_name=$(echo $VIRTUAL_ENV|awk -F'/' '{print $NF}')
    proj_path=/home/vagrant/src/$proj_name

    cd $proj_path

    if [ -d checkouts ]; then
        for ext in $(ls checkouts); do
            export PYTHONPATH=proj_path/checkouts/$ext:$PYTHONPATH
        done
    fi
#+END_SRC

Then, when I type =workon $project_name= in my shell, the environment is
activated, I'm moved to the right directory, and the library inside the
*checkouts/* directory are added to my *PYTHONPATH*.