zastosowanie buildout przy wdrażaniu projektów opartych o framework django
TRANSCRIPT
Zastosowanie buildout przy wdrażaniu projektów opartych o
framework DjangoDominik Szopa
http://dominno.pl
PyCon PL 200916-18 październik 2009
Agenda
• Django - wdrażanie projektów, • Virtualenv i Buildout, • Buildout i Django,• Podsumowanie,• Przydatne linki.
Django - wdrażanie projektów
Każdy projekt składa się z wielu zależności: • Django, • Aplikacje zewnętrzne(np. django-tagging),• Biblioteki(np. docutils, beautyfullsoap).
Django - wdrażanie projektów
Zależności mogą być instalowane z wielu źródeł:
• Systemu kontroli wersji,• Używając setup.py,• Używając setuptools i easy_install.
Django - wdrażanie projektów
Wielokrotna instalacja i konfiguracja na:• Komputerach developerów,• Serwerze,• Wszystkich innych maszynach które mają coś
wspólnego z developmentem.
Django - wdrażanie projektów
Złe praktyki: • Instalacja zależności w systemowym site-packages,• Umieszczanie projektu wraz z pakietami zależnymi w
katalogach, które nie są zdefiniowane w PYTHONPATH. Mogą prowadzić w rezultacie do:
Rozwiązanie ? Virtualenv i Buildout
Co to jest virtualenv ?
• Tworzy odseparowane, niezależne środowisko Pythona,
• Odizolowuje pakiety od systemowego site-packages.
$ virtualenv moj_env$ source bin/activate (moj_env) $ cd jakas_biblioteka(moj_env) $ setup.py install(moj_env) $ deactivate
Wady virtualenv
• Nie rozwiązuje problemu ręcznej instalacji pakietów,• Środowiska nie są przenośne,• Środowiska nie są portowalne.
Co to jest buildout ?
• Automatyzuje instalacje zależności projektu,• Projekt składa się z poszczególnych składników,
definiowanych w pliku konfiguracyjnym,• Do konfiguracji oraz instalacji określonego składnika,
używane są rozszerzenia zwane "recipes" (przepisy), • Każdy składnik zawiera informacje skąd pobrać dane oraz
gdzie je zapisać.
Istnieją przepisy które:
• Pobierają pakiety i instalują je w formie eggów,• Pobierają źródła z systemu kontroli wersji,• Tworzą symlinki,• Wykonują polecenia systemowe,• Pobierają i kompilują pakiety binarne,• Więcej na http://pypi.python.org, 160+ dostępnych.
Buildout - przykład
[buildout] parts = part1 part2
[part1] recipe = moj_przepis
[part2]
recipe = moj_inny_przepis
$ buildout PyPi moje repo
mój desktop
$ python>>> import part1>>> import part2
Buildout i Django
Istnieje przepis "djangorecipe" dla Django który:
• pobiera i instaluje Django w wskazanej wersji,• tworzy skrypt-nakładkę na manage.py w którym są wpisane
ścieżki do wszystkich zainstalowanych zależności przez Buildout.
Buildout i Django - w szczegółach
Co będzie potrzebne
• Python,• virtualenv,• bootstrap.py z
http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py,
• terminal.
Tworzenie środowiska
$ virtualenv moje_srodowisko –-no-site-packages $ cd moje_srodowisko
$ source bin/activate (moje_srodowisko)~/moje_srodowisko$
Wdrażanie Django z Buildout
$ mkdir app $ cd app $ wget
http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py
$ touch buildout.cfg
Konfiguracja Buildout dla Django
# buildout.cfg [buildout] parts = django [django] recipe = djangorecipe version = 1.1
Rozruch Buildout'a
$ python bootstrap.py Creating directory 'moje_srodowisko/app/bin'. Creating directory 'moje_srodowisko/app/parts'. Creating directory 'moje_srodowisko/app/eggs'. Creating directory 'moje_srodowisko/app/develop-eggs'. Generated script 'moje_srodowisko/app/bin/buildout'.
Instalacja Django
$ bin/buildout Getting distribution for 'djangorecipe'. Got djangorecipe 0.19.1. Getting distribution for 'zc.recipe.egg'. Got zc.recipe.egg 1.2.2. Installing django. django: Downloading Django from: http://www.djangoproject.com/download/1.0/tarball/ Generated script 'moje_srodowisko/app/bin/django'.
Uruchomienie aplikacji
• bin/django runserver• bin/django syncdb• itd.
#!/moje_srodowisko/bin/python
import syssys.path[0:0] = [ '/moje_srodowisko/app/parts/moj_pakiet1', '/moje_srodowisko/app/parts/moj_pakiet2', ]
import djangorecipe.manage
if __name__ == '__main__': djangorecipe.manage.main('moj_projekt.settings')
Jak wdrożyć swój projekt
# buildout.cfg [buildout]
parts = django moj_projekt [django] recipe = djangorecipeversion = 1.1 settings = settingsprojectegg = moj_projekt ..
.
Jak wdrożyć swój projekt# buildout.cfg ..
eggs = south django-registration extra-paths = ${buildout:parts-directory}
[moj_projekt] recipe = iw.recipe.subversion urls = http://moje_repo.com/trunk/moj_projekt_z_svn/ .
Jak wdrożyć swój projekt
$ bin/buildout . .
Installing moj_projekt. A moje_srodowisko/app/parts/moj_projekt/settings.py
. . Checked out revision 1. Creating archive: .-dev.tar.gz
mod_wsgi ? fcgi ?
djangorecipe umożliwia generowanie skryptów WSGI oraz FCGI
• opcja: wsgi = true lub,• opcja: fcgi = true.
./bin/django.wsgi
./bin/django.fcgi
Podsumowanie
• Buildout automatyzuje wdrożenia projektu, • Virtualenv odizolowuje pakiety od systemowego site-
packages, • djangorecipe umożliwia generowanie skryptów
rozruchowych dla WSGI i FCGI,
Przydatne linki
• http://www.buildout.org • http://pypi.python.org/pypi/zc.buildout • http://pypi.python.org/pypi/djangorecipe/ • http://www.sixfeetup.com/swag/buildout-quick-reference-card• http://www.doughellmann.com/projects/virtualenvwrapper/
Dziękuję za uwagę!
Bibliografia - media
• http://farm4.static.flickr.com/3237/2796908072_63dbb1e52d_o_d.jpg • http://farm3.static.flickr.com/2599/3920111676_b69ce1138d_b_d.jpg • http://farm1.static.flickr.com/6/86227485_2bd48ad7f6_o_d.jpg• ikony: http://graffletopia.com/stencils/144