При работе над 3task мы разработали удобный способ установки зависимостей для проекта. Америку я не открою, просто расскажу, что мы сделали. Надеюсь, кому-нибудь пригодится.
Зависимости обрабатываются с помощью двух инструментов: pip и virtualenv.
Virtualenv позволяет создать собственное окружение проекта, в которое можно установить любые библиотеки любых версий и они никак не будут влиять на другие проекты. Это достаточно удобно. К примеру, можно обновлять джангу и не бояться, что другие проекты попадают, как это могло бы случиться в системе, где несколько проектов используют глобально установленную django.
Pip — это инструмент для установки python-приложений. Грууубо говоря, это аналог easy_install, отличающийся рядом вкусных плюшек. Одна из убойных его фишек — возможность ставить софт прямо из репозитория. Я пробовал ставить из git, svn, hg — всё работает. Возможно, easy_install умеет что-то подобное, я не в курсе, честно говоря. Другие отличительные черты pip: поддержка virtualenv и возможность ставить софт по заранее составленному списку.
Эти два инструмента образуют удобную связку, которая позволяет вызовом одной команды настроить окружение для проекта. Выглядеть это может, например, так.
Файлик build/buildenv.sh руководит всем процессом:
#!/bin/sh
echo Creating environment
virtualenv .env
echo Install PIP inside virtual environment
./.env/bin/easy_install pip
echo Installing dependencies
./.env/bin/pip install -E .env -r ./build/pipreq.txt
То есть сначала создаём виртуальное окружение с помощью инструмента virtualenv. Далее устанавливаем pip через easy_install. Можно, конечно и средствами пакетного менеджера вашей ОС, но easy_install стоит почти везде, так что грех этим не воспользоваться. Третий шаг — установка необходимых библиотек в виртуальное окружение по списку.
Приведу пример файла зависимостей:
-e svn+http://code.djangoproject.com/svn/django/trunk@10748#egg=django
-e svn+http://django-filebrowser.googlecode.com/svn/trunk@358#egg=django-filebrowser
-e svn+http://sorl-thumbnail.googlecode.com/svn/trunk@449#egg=solr
-e svn+http://django-tagging.googlecode.com/svn/trunk@156#egg=django-tagging
-e hg+http://bitbucket.org/lorien/django-account#egg=django-account
-e hg+http://hg.barbuza.info/supercaptcha/#egg=supercaptcha
-e hg+http://bitbucket.org/lorien/pybb#egg=pybb
django-renderform
simplejson
markdown
beautifulsoup
http://django-tinymce.googlecode.com/files/django-tinymce-1.5.tar.gz
Как видите, источники можно указывать самые разные: адреса hg/git/svn репозиториев, адреса архивов, просто имена (поиск идёт через pypi.python.org). Единственное условие: пакет по указанному адресу должен обязательно содержать файл setup.py.
Если специально не запрещать, то пакет ищется сначала в виртуальном окружении, в случае неудачи — в глобальном окружении. Это мне помогло в случае PIL. Почему-то не хотел он компиляться при установке через pip — я поставил его через apt. Драйвера баз данных типа mysqdb мне тоже кажется удобным ставить отдельно — в глобальную область видимости.
Можно почитать по теме: