Так что это то, что я сейчас использую.
У всех проектов будет корневая директория virtualenv.Мы называем это как .env и игнорируем в vcs.Первое, что сделал dev, когда начал заниматься разработкой, - это инициализировал virtualenv и установил все требования, указанные в файле needs.txt.Я предпочитаю иметь virtualenv внутри dir проекта, чтобы он был очевиден для разработчика, а не в каком-то другом месте, например $HOME/.virtualenv
, а затем делать source $HOME/virtualenv/project_name/bin/activate
для активации среды.Вместо этого разработчик взаимодействует с virtualenv, вызывая исполняемый файл env непосредственно из корня проекта, например: -
.env/bin/python
.env/bin/python manage.py runserver
Для развертывания у нас есть сценарий Fabric, который сначала экспортирует каталог нашего проекта вместе с каталогом .env.в tarball, затем скопируйте tarball на работающий сервер, распакуйте его каталог развертывания и выполните некоторые другие задачи, такие как перезапуск сервера и т. д. Когда мы распаковываем tarball на работающем сервере, сценарий фабрики обязательно запускает virtualenv, чтобы всепуть Шебанга в .env/bin
исправлен.Это означает, что нам не нужно переустанавливать зависимости снова на работающем сервере.Рабочий процесс фабрики для развертывания будет выглядеть следующим образом: -
fab create_release:1.1 # create release-1.1.tar.gz
fab deploy:1.1 # copy release-1.1.tar.gz to live server and do the deployment tasks
fab deploy:1.1,reset_env=1 # same as above but recreate virtualenv and re-install all dependencies
fab deploy:1.1,update_pkg=1 # only reinstall deps but do not destroy previous virtualenv like above
Мы также не устанавливаем src проекта в virtualenv с помощью setup.py, а вместо этого добавляем путь к нему в sys.path.Поэтому при развертывании в mod_wsgi мы должны указать 2 пути в нашей конфигурации vhost для mod_wsgi, что-то вроде: -
WSGIDaemonProcess project1 user=joe group=joe processes=1 threads=25 python-path=/path/to/project1/.env/lib/python2.6/site-packages:/path/to/project1/src
Короче:
- Мы по-прежнему используем pip + virtualenvдля управления зависимостями.
- Нам не нужно переустанавливать требования при развертывании.
- Нам нужно немного поддерживать путь в sys.path.