20.03

Развертывание django-проекта с помощью Buildout

Итак, приложения, которые используются более чем в одном проекте мы выносим из проекта и распространяем как дополнительные библиотеки языка python. Проект разворачиваем в виртуальное окружение, созданное с помощью virtualenv, пакеты в него устанавливаем через pip. Данный подход вполне универсален, но требует ручной работы. Процесс можно автоматизировать с помощью fabric, но он скорее для сисадмина чем для простого разработчика. Если вам не нужно разворачивать проект на нескольких серверах и делать на серверах много рутины или какие-то сложные вещи, то fabric не нужен. Другой вариант - разворачивать проект через buildout.

Для начала работы необходимо сачать скрипт для развертывания окружения:

wget http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py

Разворачиваем окружение:

python bootstrap.py

Описываем проект в файле buildout.cfg:

[buildout]
parts =
    pip
    django
install-from-cache=true
offline=true

[django]
recipe = djangorecipe
version = trunk
project = library
settings=production
test =
    events_list
extra-paths   =
    ${pip:sources-directory}/tagging-autocomplete

[pip]
recipe = gp.recipe.pip
relative-paths = true
install =
    -r project.req
sources-directory = src

В данной конфигурации проект называется library, настройки проекта будут браться из файла production.py, тесты будут запускаться для приложения events_list, будет использоваться последня trunk версия django, зависимости проекта хранятся в файле project.req (мне так удобней, подробности будут позже в отдельной статье), они будут установлены с помощью pip автоматически перед установкой django. Если в списки зависимостей указаны репозитории пакетов, то необходимо папки с ними добавить в опцию extra-paths секции django.

Разворачиваем проект:

./bin/buildout

Запускаем тестовый сервер:

./bin/django runserver

Обратите внимание, управление проектом происходит с помощью запуска ./bin/django, а не manage.py, находящимся внутри проекта. ./bin/django запускает manage.py проекта, используя выбранный при развертывании среды интерпритатор, и предварительно добавляет в sys.path пути к приложениям, от которых зависит проект.

Запускаем тесты:

./bin/test

Здесь то же самое, что с ./bin/django, но manage.py запускается с командой test и списком приложений проекта в качестве аргументов.

Если необходимо установить новое приложение, то изменяем buildout.cfg и еще раз запускаем ./bin/buildout для развертывания проекта с обновленной конфигурацией.

Таким образом, одной командой запускается развертывание окружения, установка в него проекта и необходимых приложений, создаются команды для управления проектом в развернутом окружении. Если развертывание происходит на машине разработчика, то для всех проектов можно использовать общие кэши для загрузуки пакетов и таким образом ускорить развертывание. Для ускорения развертывания так же можно включить режим offline.

Buildout удобно использовать:

  • при работе в команде на старте проекта, когда над проектом работает несколько человек и каждый устанавливает новые зависимости;
  • когда к проекту подключается новый разработчик, тратится минимум времени на объяснение того как ему локально развернуть проект, особенно если человек далек от python и django (верстальщик, специалист по клиентской части, flash и т.п.);
  • на этапе сопровождения, когда прошло приличное время, разработчику необходимо локально развернуть проект для внесения изменений, не вспоминая в каком порядке и что еще нужно сделать после установки пакетов.

Основное отличие от virtualenv + pip в том, что можно собирать пакеты не только на python. Например, можно установить БД и завести в ней необходимых пользователей. Отличие от fabric в том что процесс развертывания запускается на одном сервере и по строго заданному сценарию. Fabric дает большую гибкость и больше подходит для задач системного администрирования, чем для быстрого развертывания песочницы.

 

Ссылки по теме

Раздел: Django Тэги: buildout, pip

Коментарии

#114.06.2011, 15:28 alekam пишет:

Альтернативный вариант развертывание проекта

$ virtualenv --no-site-packages newproject
$ cd newproject
$ bin/easy_install zc.buildout
$ bin/buildout init
правим buildout.cfg
$ bin/buildout

#219.01.2012, 19:35 Юрий пишет:

В принципе это отличная система, но я никак не пойму как использовать ее при разработке.
Пример: я установил движок для интернет магазина LFS(http://www.getlfs.com/), он как раз использует для развертывания buildout.
форкнул его на github, сделал необходимые изменения.
Как мне заставить buildout устанавливать измененный компонент из моего репозитория, а не из репозитория автора ?
Заранее извиняюсь за возможно глупый вопрос... но для меня решение не очевидно...

#318.03.2012, 04:51 Nick пишет:

После таких поверхностных статей только вопросы и остаются. Тема вообще не раскрыта.

Почему pip, а не стандартный механизм?
Как добавить в конфиг LFS пакеты, которые нужны для разработки?
Как собирать разработанный на основе LFS проект?

Вот это не прокомментировано
install-from-cache=true
offline=true
а тем временем это будет вызывать ошибку

и т.д.

#416.04.2012, 22:29 alekam пишет:

install-from-cache=true
offline=true
Это чтобы пакеты не скачивались при установки, а брались из кэша. По-умолчанию, они каждый раз качаются из pypi.

# - комментарий

Более полный конфиг.
Предварительно создано окружение в папке ./env/
Проект находится в ./my_project/
Файл настроек - ./my_project/settings/production.py
В requirements.txt описаны все зависимости проекта - стандартный файл зависимостей PIP.

ВНИМАНИЕ! В PIP 1.1 изменилась работа с виртуальным окружением - этот конфиг работать не будет.
PIP используем, чтобы получить единый интерфейс к разным источникам пакетов (PyPI, git, svn). Соответсвенно, то что собираемся через него устанавливать должно быть дистрибутивом пакета (содержать setup.py).

###########################################################
[buildout]
parts =
pip
debug
django
eggs =
#newest = false
relative-paths = true
versions = versions

# пути к кэшам
download-cache = ${buildout:directory}/downloads
eggs-cache = ${buildout:download-cache}/eggs
extends-cache = ${buildout:download-cache}/extends

# пути
executable = ${buildout:directory}/env/bin/python
bin-directory = ${buildout:directory}/bin
develop-eggs-directory = ${buildout:directory}/env/develop-eggs
eggs-directory = ${buildout:directory}/env/eggs
parts-directory = ${buildout:directory}/env/parts

# места, где ищем пакеты в дополнение к PyPI
find-links =
http://www.djangoproject.com/download/

[django]
recipe = cykooz.djangorecipe
project = my_project
settings=settings.production
eggs = ${debug:eggs}
test = myapp myanotherapp # здесь можно указать название своих приложений
# будет создан скрипт для запуска тестов для этих приложений
# аналогично запуску manage.py myapp myanotherapp
extra-paths =
${buildout:directory}/${django:project} # нужно т.к. папка проекта не в python path
# positions и pagination будем устанавливать из репозитория, поэтому добавляем пути
${pip:sources-directory}/positions
${pip:sources-directory}/pagination
${pip:sources-directory}/snippets

[pip]
recipe = gp.recipe.pip
virtualenv = ${buildout:directory}/env
indexes = http://pypi.my-private-site.ru/ # ваш личный PyPI
install =
-r requirements.txt # используем файл с описанием зависимостей.
# это не обязательно, но удобно, если в команде не все используют buildout
sources-directory = ${buildout:directory}/src # место, куда будут выкачиваться исходники
relative-paths = true # используем относительные пути, чтобы можно было просто скопировать
eggs = ${buildout:eggs}

[debug]
recipe = zc.recipe.egg
eggs =
${pip:eggs}
django-debug-toolbar
werkzeug
coverage>=3.0
django-coverage
django_extensions
django-pdb
dependent-scripts = true # отслеживаем и разрешаем зависимости

[versions]
Django = 1.4 # это требование рецепта cykooz.djangorecipe
###########################################################

#516.04.2012, 22:30 alekam пишет:


Пример файла с зависимостями
###########################################################
django==1.4
# если разворачиваем через buildout прописывать здесь djagno не нужно, оставляем ее для совместимости
mysql-python
django-annoying
South
pytils
django_mptt>=0.4.0
django-classy-tags==0.3.4.1
-e git+git://github.com/jpwatts/django-positions.git#egg=positions
-e git+git://github.com/ericflo/django-pagination.git#egg=pagination
-e git+git@my-private-site.ru:django-snippets#egg=snippets
###########################################################

Последние три строчки указывают на то, что эти пакеты нужно будет установить из репозитория. Соответсвенно если вносим изменения в чужой проект, изменяем там зависимости, то в зависимостях указываем свои репозитории.

В последней строчки получаем код из собственного git репозитория, запущенного через gitolite.

#608.04.2013, 21:31 Fjznla пишет:

Izxuwr http://www.pradatome.com/ - プラダ アウトレット Vmugml Pjtuwt http://www.pradatome.com/ - プラダ 財布 Lbqvgk Hypviv http://www.pradatome.com/ - プラダ バッグ Qoltxx Umjlkj http://www.pradatome.com/ Ixjukm Obalrl http://www.chloeye.com/ - クロエ アウトレット Fszqst Imuctv http://www.chloeye.com/ - クロエ 財布 Qlupey Epmbsp http://www.chloeye.com/ - クロエ バッグ Bqirxe Itccef http://www.chloeye.com/ Gzprak Vdmkyr http://www.paulsmithyasuyi.com/ - ポールスミス アウトレット Nqzcsd Irdlyz http://www.paulsmithyasuyi.com/ - ポールスミス 財布 Rkjute Xywnfi http://www.paulsmithyasuyi.com/ - ポールスミス バッグ Zneysr Enhpjy http://www.paulsmithyasuyi.com/ Fnfpdc Jtvdjs http://www.guccibrandsale.com/ - グッチ アウトレット Sardvs Pcphnx http://www.guccibrandsale.com/ - グッチ 財布 Oudceo Nbqxtn http://www.guccibrandsale.com/ - グッチ バッグ Wulavz Qshjty http://www.guccibrandsale.com/ Scpebt Ndfblm http://www.coachonlyyou.com/ - コーチ 財布 Nqbidh Qggthi http://www.coachonlyyou.com/ - コーチ バッグ Cmlijj Tkqohl http://www.coachonlyyou.com/ - コーチ アウトレット Qwcawq Kxlmhn http://www.coachonlyyou.com/ Hxwhnh Yoavua http://www.coachbayi2013.com/ - coach 財布 Rscmdf Cnvqbm http://www.coachbayi2013.com/ - coach アウトレット Ohhupj Cebfvr http://www.coachbayi2013.com/ - コーチ 財布 新作 Bppbxa Onnopy http://www.coachbayi2013.com/ Fktmlc

Оставьте комментарий

© 2010 Алексей Камедов

При копировании материалов блога ссылка на источник обязательна.