Мне всегда казалось, что для небольших проектов использование 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

 


Comments

Alexey Diyan Ukraine

Wednesday, January 4, 2012 9:50 PM

Alexey Diyan

Не сочти за невежливость, просто хотел прокомментировать некоторые утверждения.

> pep8 & pylint для проверки кода.

Мне кажется что PyLint полностью перекрывает по-функционалу утилиту PEP8, поэтому если PyLint уже настроен, то от PEP8 можно спокойно отказаться.

Кроме того у PyLint более широкие возможности по тонкой настройке под нужды проекта, тогда как PEP8 мне удавалось сконфигурировать исключительно программно - утилиту вызывал как Python-класс.


> $ virtualenv ./pip-test/ --no-site-packages

В самой-самой последней версии virtualenv ключ --no-site-packages объявлен как устаревший. Утилита virtualenv стала работать в таком режиме по-умолчанию.

Alexey Diyan Ukraine

Wednesday, January 4, 2012 9:59 PM

Alexey Diyan

PyLint configuration for one of our Python project
https://gist.github.com/1561460

e0ne United States

Wednesday, January 4, 2012 11:27 PM

e0ne

Наверное, у меня не самая последняя версия virtualenv, т.к. сегодня без ключа --no-site-packages создавалось не то, что мне нужно

rostnix Ukraine

Sunday, January 8, 2012 4:14 PM

rostnix

Хорошим тоном работы с virtualenv, это проваливаться в нее (типа chroot).
Пример:

virtualenv2 --no-site-packages env
source ./env/bin/active

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

Это так же меня смущает, так если выполнить это команду не в "ENV", то пакет ставиться в стандартную DIR Python, а не в "ENV".

Для того что бы установить в "ENV" у pip есть ключ -E:

pip-2.7 install django -E env/

Спасибо.



e0ne United States

Monday, January 16, 2012 4:19 PM

e0ne

Команда "source ./env/bin/active" делается у меня уже настолько автоматически, что я даже забыл о ней написать Frown

Michael_XIII Russia

Thursday, January 19, 2012 10:16 PM

Michael_XIII

А chef или puppet тут не помогут?

Как бы более "методически грамотней" (c) способ будет для развертывания

e0ne United States

Friday, January 20, 2012 2:02 PM

e0ne

Использование chef/puppet может оказаться "стрельбой из пушки по воробьям", когда нужно создать окружение для небольшого проекта, которому для работы нужно всего-то несколько дополнительных библиотек

e0ne United States

Thursday, February 16, 2012 2:04 AM

e0ne

Вместо chef/puppet для создание development environment можно еще vagrant использовать - просто и быстро создавать виртуальные машины.

Comments are closed