Davide Targa website

Programming, web development and open source

Creazione Di Un Egg Python

Un egg python è essenzialmente una struttura logica di un pacchetto per il rilascio e la distribuzione di progetti python. Si tratta della stessa idea degli archivi .deb per le distribuzioni linux debian based o degli archivi .jar per di java.

In questo post effettueremo la creazione e il rilascio di un egg per mezzo del prodotto jarn.mkrelease.

Note preliminari

Creiamo un virtualenv e installiamo jarn.mkrelease con il comando:

1
pip install jarn.mkrelease

Prima della creazione dell’egg aggiorniamo il changelog del nostro prodotto (file docs/HISTORY.txt) e il numero di versione nei file setup.py e namespace/package/version.txt. Se utilizziamo un sistema di versioning del codice sorgente (cosa caldamente consigliata), committiamo le modifiche con il messaggio:

1
Releasing version x.y.z.

In questo esempio supponiamo di voler rilasciare l’egg nella directory /home/hen/eggs di un server remoto eggs.example.com sulla quale dovremo avere già configurato un virtualhost che mostri il contenuto della directory eggs. L’upload dell’egg sul server remoto verrà effettuato tramite ssh, quindi è necessario che nella macchina sia installato e attivo un server ssh.

Configurazione di base

Nella home della macchina di sviluppo creiamo il file di configurazione di mkrelease con il nome .mkrelease e configuriamo il prodotto per pubblicare l’egg nella posizione descritta in precedenza. Il contenuto del file sarà quindi qualcosa del tipo:

1
2
3
4
5
6
[mkrelease]
distbase    = 
distdefault = dist

[aliases]
dist = eggs:/home/hen/eggs/

La variabile dist nella configurazione di mkrelease indica il server e la directory nella quale vogliamo che l’egg venga rilasciata. In questo caso l’host eggs è stato configurato nel file ~/.ssh/config dove è stata aggiunta la seguente configurazione:

1
2
3
4
Host eggs
    HostName eggs.example.com
    Port 1234
    User hen

Procedimento

Dopo avere completato la configurazione come descritto in precedenza, per creare e rilasciare l’egg è sufficiente lanciare il comando mkrelease . dalla root del progetto. Al termine delle operazioni di creazione dell’egg ci verrà richiesta la password per effettuare la copia dell’archivio sull’host remoto. Mkrelease effettuerà quindi le seguenti operazioni:

  • tagging della release con il numero di versione specificato nel file setup.py
  • creazione dell’egg e del file zip contenente l’egg stesso nella directory dist
  • copia del file zip nell’host remoto per mezzo di scp

Di seguito è riportato parte dell’output:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Releasing namespace.package x.y.z
Tagging namespace.package x.y.z
running egg_info
writing requirements to namespace.package.egg-info/requires.txt
writing namespace.package.egg-info/PKG-INFO
writing namespace_packages to namespace.package.egg-info/namespace_packages.txt
writing top-level names to namespace.package.egg-info/top_level.txt
writing dependency_links to namespace.package.egg-info/dependency_links.txt
writing entry points to namespace.package.egg-info/entry_points.txt
using git file-finder
84 files found
reading manifest template 'MANIFEST.in'
writing manifest file 'namespace.package.egg-info/SOURCES.txt'
running sdist
creating namespace.package-0.3.4dev
...
...
making hard links in namespace.package-x.y.z...
hard linking MANIFEST.in -> namespace.package-x.y.z
...
...
copying setup.cfg -> namespace.package-x.y.z
Writing namespace.package-x.y.z/setup.cfg
creating 'dist/namespace.package-x.y.z.zip' and adding 'namespace.package-x.y.z' to it
adding 'namespace.package-x.y.z/README.txt'
...
...
removing 'namespace.package-x.y.z' (and everything under it)
running scp_upload
Uploading dist/namespace.package-x.y.z.zip to eggs:/home/hen/eggs/
OK
done

Al termine possiamo pushare il tag di versione creato da mkrelease (esempio con git) con il comando:

1
git push --tags

Altri accorgimenti

Per evitare di inserire la password dell’utente sull’host remoto ogni volta che si effettua il rilascio di un egg, è possibile inserire la propria chiave pubblica all’interno del file /home/hen/.ssh/authorized_keys, in modo tale che l’autenticazione venga effettuata in modo automatico per mezzo delle chiavi asimmetriche.

Comments