Итак, все говорят мне использовать pip и virtualenv, но никто не может объясните мне, как это лучше, чем мой нынешний подход. Главная причина для людей, чтобы использовать pip и virtualenv, кажется, что все остальные используют его...
Я уверен, что есть очень веские причины использовать PIP и virtualenv, но у меня нет смогли найти их в Google. Я надеюсь, что кто-то из Сообщество stackoverflow сможет объяснить их мне.
Вот как я сейчас организую проекты Django:
site/src/ : contains all python-only dependencies of my project
site/lib/ : contains symlinks to the python packages
site/[projectname]/ : contains all my project specific code
Вся папка сайта проверяет мой репозиторий (да, включая все зависимости от python, такие как сам django).
Все зависимости, отличные от python (PIL, psycopg2,...), задокументированы в README и установлены на системном уровне (apt-get install....)
Например, скажем, у меня есть название проекта "projectfoo", которое зависит от django-1.2.3, pygeoip-0.1.3 и psycopg2 у меня будет:
/usr/lib/python2.5/site-packages/psycopg2
~/projects/foo/site : checkout of my repository
~/projects/foo/site/src/django-1.2.3
~/projects/foo/site/src/pygeoip-0.1.3
~/projects/foo/site/lib/django -> symlink to ../src/django-1.2.3/django
~/projects/foo/site/lib/pygeoip -> symlink to ../src/pygeoip-0.1.3/pygeoip
~/projects/foo/site/projectfoo/
Теперь, как это сравнивается с PIP/virtualenv на практике?
Развертывание проекта с моим текущим подходом:
svn checkout https://myserver.com/svn/projectfoo/tags/1.0.0STABLE/site
Развертывание с помощью PIP/virtualenv:
wget https://myserver.com/svn/projectfoo/tags/1.0.0STABLE/projectfoo-requirements.txt
pip install -U -E projectfoo-venv -r projectfoo-requirements.txt
Работа над проектом с моим текущим подходом:
cd ~/projects/foo/site/projectfoo
export PYTHONPATH=.:..:../lib
./manage.py runserver 0:8000
Работа над проектом с PIP/virtualenv:
workon projectfoo
cd path/to/project
./manage.py runserver 0:8000
Работа с зависимостями, отличными от python:
отношения, отличные от python, будут обрабатываться одинаково, я никак не могу
собирается использовать опцию --no-site-packages
virtualenv и установить компилятор
и все зависимости от сборки на моих серверах, я не думаю, что кто-то на самом деле
все равно.
Обновление зависимости только от python с моим текущим подходом:
Я проверяю/распакую новую версию в src, удаляю старую из src, обновляю
symlink в lib и commit. Теперь все остальные, работающие над проектом, получат обновление на
их следующий svn up
или git pull
. Одно нехорошо, так это то, что старый
папка в src останется, если в ней содержится некоторый файл pyc, это может легко
избегайте удаления всех pyc перед обновлением локальной копии.
Обновление зависимости только от python с помощью PIP/virtualenv:
Вы передаете новую версию файла требований, надеюсь, что все, кто работает над
проект замечает новую версию, когда обновляет свою локальную копию, а затем
выполните pip install -E projectfoo-venv -r requirements.txt
.
Изменить: я удаляю использование -U с помощью pip, это не нужно с pip 8.2
Изменить. Единственное преимущество в pip/virtualenv над моим текущим подходом, похоже, заключается в работе над различными проектами, требующими различной версии python. Но в моем опыте, когда вам нужны разные версии python, вы также нужны разные версии других системных библиотек (PIL, psycopg2,...) и virtualenv не помогает с этим (за исключением случаев, когда вы достаточно сумасшедшие, чтобы используйте опцию -no-site-package, и даже тогда она не завершена). Единственное решение, о котором я могу думать, - это использование разных виртуальных машин.
Итак, что мне не хватает? Может ли кто-нибудь указать мне на случай использования, где PIP или virtualenv будет лучше, чем то, что я делаю?