Sunday, July 22, 2012

virtualenv + pip как альтернатива buildout

http://blog.e0ne.info/post/virtualenv-and-pip-instead-of-buildout.aspx
Мне всегда казалось, что для небольших проектов использование buildout - это как с пушки по воробьям: долго, сложно и неудобно. Хотелось чего-то более простого и понятного. И таким оказалась связка virtualenv + pip.
Про virtualenv я уже писал тутpip - это замена easy_install, менеджер пакетов для python, который позволяет быстро и удобно устанавливать, обновлять и удалять пакеты. Более подробно можно почитать на официальном сайте. Сейчас же меня интересует возможность быстрого развертывания необходимого окружения для запуска проекта. В двух словах, задача выглядит так:
Нужно запустить проект, который для работы требует следующие пакеты:

  • Django;
  • SQL Alchemy;
  • pep8 & pylint для проверки кода.

Стандартный алгоритм решения - создать новое окружение с помощью virtualenv и установить нужные пакеты. Но ведь не делать же это каждый раз каждому разработчику руками? А на build-сервере? Пришедшая мне первая мысль (написание нужного bash-скрипта) к счастью, оказалась не совсем правильной. Т.е. для полной автоматизации небольшой bash-скрипт будет не лишним, но вот устанавливать пакеты проще и правильнее через pip. Итак, как же нам установить все необходимые пакеты?

Шаг 1. Создаем virtual environment
$ virtualenv ./pip-test/ --no-site-packages
Ключ --no-site-packages указывает на то, что в нашем окружении не будет доступа к пакетам, установленных в операционной системе. Такая себе чистая, ничем не испачканная песочница.

Шаг 2. Устанавливаем нужные пакеты
Первый раз все-таки будет необходимо установить все пакеты вручную, т.к. список нужных пакетов на данном этапе бывает далеко не всегда.
$ pip install Django
$ pip install SQLAlchemy
$ pip install pep8
$ pip install pylint

Шаг 3. Автоматизируем установку пакетов
После установки нужных пакетов можно выполнить команду pip freeze -l, которая выведет на экран список установленных пакетов с их версиями. В моем случае, это выглядит так:
$ pip freeze -l
Django==1.3.1
SQLAlchemy==0.7.4
logilab-astng==0.23.1
logilab-common==0.57.1
pep8==0.6.1
pylint==0.25.1

Ключ -l выводит пакеты установленный только внутри virtualenv, что при создании окружения с ключем --no-site-packages теряет всякий смысл.
Далее этот список нужно сохранить:
$ pip freeze -l > pip-requirements
Тепреь в файле pip-requirements лежит список всех необходимых для запуска пакетов. Этот нужно положить в вашу source control и при необходимости обновлять.
Чтобы установить все необходимые пакеты, необходимо выполнить команду:
$ pip install -r pip-requirements

Несколько рускоязычных статей про buildout можно найту тут: http://www.vurt.ru/tag/buildout

No comments:

Post a Comment