.. _buildout-env: =========================== Installazione con buildout =========================== Scopo del setup illustrato qui di seguito è: * Creare un workflow in cui il setup di un sito sia fulmineo, almeno per quanto riguarda il lavoro umano... * Creare una setup isolato e riproducibile. Le librerie utilizzate devono essere sotto stretto controllo del programmatore * Deve essere possibile derogare se necessario (ad esempio non vogliamo ricompilare il modulo 'uno' necessario per collegarsi a Libreoffice) Possibili alternative ====================== le alternative possibili sono 1. virtualenv_ 2. buildout_ (ricca documentazione su pypi_) Mentre virtualenv risulta particolarmente efficace per l'isolamento, buildout risulta più pratico per la configurabilità. Noi useremo ``buildout`` e costruiremo dentro un virtualenv in modo automatico. Entrambi richiedono di compilare alcuni pacchetti quindi devono essere installati anche alcuni pacchetti dev. .. note:: Buildout ha recentemente rilasciato un ramo >= 2.0 che NON possiamo usare in quanto la principale ricetta che usiamo (tl.buildout_virtual_python_) non è stata ancora portata. O usiamo la 1.7.1 o la 1.5.2-sd. Buildout in pratica =================== L'installazione di jumbo e dei siti che lo usano viene fatta usando ``buildout`` nel seguente modo:: hg clone http://hg.thundersystems.it/siti/www.mysite.it cd www.mysite.it python bootstrap.py bin/buildout dj # equivalente a bin/django shell = ./manage.py shell Configurazioni una tantum ========================== Questo semplice sistema prevede che siano state prese alcune precauzioni una volta nel sistema (non per ogni pacchetto/sito) e che sia stato personalizzato il sistema opportunamente. Il modo facile è installando il pacchetto ``thunder-buildout`` dai repositori argo ma raccomando di leggere anche :ref:`l'installazione manuale ` dove spiego i vari componenti. installazione tramite pacchetto deb ----------------------------------- Occorre installare il pacchetto ``thunder-buildout`` che è un pacchetto che contien pochi file ma molte dipendenze, ad esempio libreoffice che viene usato in molti progetti per produrre le stampe. .. note:: al momento fa partire in automatico libreoffice all'avvio del pc, questo non è opportuno per i nostri pc personali e quindi verrà modificato a breve. Aggiungere la sorgente argodef:: echo deb http://apt.argolinux.org precise main >> /etc/apt/sources.list apt-get update apt-get install thunder-buildout Attenzione che il pacchetto installa una situazione funzionante comprensiva delle seguenti configurazioni: * configurazione in :file:`/root/.buildout` (leggi in seguito) * configurazione in :file:`/home/www` (leggi sotto) * fornisce i comandi :|dj|: interazione fondamental, equivalente a ``manage.py`` ma chiama Python nell'ambiente virtuale corretto e può essere chiamato da qualunque sottocartella del progetto. Utile anche per generare documentazione e fare upload della stessa :ref:`dj` |dj| :|py|: chiama ip python dell ambiente virtuale :|ipy|: chiama ipython dell'ambiente virtuale :|jmb-test-setup|: utile strumento per testate quali pacchetti sono presenti nell'ambiente viutuale, generare i link ai repositori (vedi sotto), manipolare i repo sotto ``.src`` :|jmb-start|: starter di ogni applicazione. Crea un progetto/applicazione nuovi a partire da un template che viene tenuto costantemente aggiornato a come vogliamo che siano i progetti/applicazioni :|jmb-prepare|: crea i pacchetti e cura l'upload nel nostro repository pipy_ :|jmb-go|: una script che permette un avvio rapido di progetti Struttura cartelle =================== Il comandi riportati sopra (file:`python boostrap.py` e file:`bin/buildout`) creano una struttura come la seguente:: . |-- bin | `--python << eseguibile "isolato" |-- .develop-eggs << egg-link ai sorgenti |-- parts | |-- buildout | `-- vpython << virtual evironment `-- .src |-- jmb.core << codice sorgente (hg clone ...) |-- ... mentre altre eggs saranno depositate nella cartella indicata nella configurazionedi default ``~/.buildout/default.cfg``. Sotto :file:`.src` troviamo tutti i sorgenti di cui è stato fatto il checkout, ovvero quei sorgenti richiesti nella configurazione. È possibile ed è lasciata libertà (dalla ricetta, non da me) di scegliere se sostituirlo con un link simbolico. Spesso è la cosa più opportuna e per sostiture tutti i link in un sol colpo potete usare il comando:: jmb-test-setup -l buildout.cfg ============ buildout usa "ricette" ed "estensioni" per implementare le cose che vogliamo fare. Le ricette che ho scelto puntano a: .. _tl.buildout_virtual: :creare un ambiente isolato: questo è compito di tl.buildout_virtual_python_, il compito è quello di fare in modo che il nostro ambiente non "veda" nessuna libreria di sistema in modo da essere sicuri che le librerie dichiarate in ``setup.py`` e in buildout.cfg siano le uniche necessarie. .. _django-recipe: :creare ambiente per django: questo è compito di djangorecipe_: crea un binario chiamato ``django`` che è l'equivalente di ``manage.py`` ma che ha già impostato il path nel modo corretto: ogni volta che avremmo suato ``./manage.py`` suiamo questo in alternativa per avere un ``manage.py`` che opera sullo stesso ambiente virtuale. Ad esempio:: bin/django test bin/django runserver bin/django shell djangorecipe crea anche una configurazione per wsgi che però è incompatibile con il virtualenv, vedi :ref:`wsgi` per leggere la soluzione. :usare i nostri sorgenti: questo è compito di mr.developer_. Buildout può lavorare in modo ``eggs`` o ``develop``. In sostanza per ogni libreria dichiarata in ``${vpython:eggs}`` verrà creata una voce di sys.path che punta ad una cartella egg. Suggerisco di creare la configurazione iniziale con :ref:`jmb-start`, ma riporto un esempio di :file:`buildout.cfg` che non è completo: .. code-block:: ini [buildout] extends = thunder-buildout.cfg develop = . # dichiariamo la cartella corrente # come cartella in sviluppo parts = req django ipython extensions = mr.developer auto-checkout = * sources-dir = .src [vpython] # creiamo un ambiente isolato analogo # a quello creato da virtualenv recipe = tl.buildout_virtual_python eggs = tl.buildout_virtual_python cybergun jumbo-core jumbo-contacts jumbo-ecommerce extra-paths = ${thunder:extra-paths} site-packages = false # come --no-site-packages di virtualenv [req] recipe = zc.recipe.egg python = vpython # forza l'uso dell'ambiente virtuale eggs = babel interpreter = py [sources] # le sorgenti elencate qui sono automaticamnete messe # nelle develop-egg quindi disponibili senza bisogno di aggiungerle nelle egg jmb.core = hg ${thunder:jmb2}/jmb.core jmb.openvpn = hg ${thunder:jmb2}/jmb.openvpn [django] recipe = djangorecipe settings = tsettings eggs = django python = vpython absolute_path = True [ipython] recipe = zc.recipe.egg python = vpython eggs = ipython .. _setup.py: setup.py ========= Tutto il sistema di packaging di Python si basa sulla configurazione contenuta in ``setup.py`` in particolare nella direttive: :name: nome del pacchetto (es.: jumbo-core) :install_required: dipendenze esplicite del pacchetto:: ['setuptools', 'xlwt', 'xlrd', 'django <= 1.2.7'] :packages: pacchetti messi a disposizione (es.: ['admin_tools', 'jumbo', ...]) nella maggior parte dei casi va bene il default scritto nel template usato da :ref:`jmb-start`:: packages=find_packages(exclude=['tests', 'tests.*']) :version: è la versione di un pacchetto, indispensabile per potere fissare le rel che veramente funzionano :package_data: sono i file che devono essere inclusi nel pacchetto anche se non sono moduli python: file css, js, html, png e txt. Oltre che qui vanno segnalati anche in MANIFEST.in. Il progetto di default mostra lesempio di come fare questo. Nel setup.py di default è inclusa la funzione ``get_data_files`` per facilitare l'inclusione degli stessi. Una esauriente introduzione al setup può essere letta qui_ .. |dj| replace:: :ref:`dj` .. |jmb-start| replace:: :ref:`jmb-start` .. |jmb-go| replace:: :ref:`jmb-go` .. |jmb-sync| replace:: :ref:`jmb-sync` .. |jmb-prepare| replace:: :ref:`jmb-prepare` .. |jmb-test-setup| replace:: :ref:`jmb-test-setup` .. |ipy| replace:: :ref:`ipy` .. |py| replace:: :ref:`py` .. _tl.buildout_virtual_python: https://bitbucket.org/tlotze/tl.buildout_virtual_python/ .. _mr.developer: http://pypi.python.org/pypi/mr.developer .. _virtualenv: http://www.virtualenv.org/en/latest/index.html .. _buildout: http://www.buildout.org/ .. _buidldout_pypi: http://pypi.python.org/pypi/zc.buildout/1.5.2 .. _virtualenv: http://www.virtualenv.org/en/latest/index.html .. _pypi: http://pypi.python.org/pypi/zc.buildout/1.5.2 .. _qui: http://docs.python.org/distutils/sourcedist.html .. _pipy: http://pypi.thundersystems.it .. _djangorecipe: http://pypi.python.org/pypi/djangorecipe/1.3