2012-02-25 11 views
26

Sto seguendo questo tutorial: http://devcenter.heroku.com/articles/djangoDa virtualenv, pip freeze> requirements.txt fornisce TONES di garbage! Come tagliare?

Ad un certo punto ho dovuto inviarci fare:

pip freeze > requirements.txt 

(. Ofc da virtualenv creato un'istanza di pitone)

E io ottenere questo :

(venv)[email protected]:~/Programowanie/hellodjango$ cat requirements.txt 
BeautifulSoup==3.2.0 
Brlapi==0.5.5 
CherryPy==3.1.2 
ClientForm==0.2.10 
Django==1.3 
GnuPGInterface==0.3.2 
PAM==0.4.2 
PIL==1.1.7 
Routes==1.12.3 
Twisted-Core==11.0.0 
Twisted-Names==11.0.0 
Twisted-Web==11.0.0 
WebOb==1.0.8 
adium-theme-ubuntu==0.3.1 
apt-xapian-index==0.44 
apturl==0.5.1ubuntu1 
chardet==2.0.1 
command-not-found==0.2.44 
configglue==1.0 
cssutils==0.9.8a1 
defer==1.0.2 
distribute==0.6.19 
django-tagging==0.3.1 
dnspython==1.9.4 
duplicity==0.6.15 
gnome-app-install==0.4.7-nmu1ubuntu2 
httplib2==0.7.2 
jockey==0.9.4 
keyring==0.6.2 
launchpadlib==1.9.8 
lazr.restfulclient==0.11.2 
lazr.uri==1.0.2 
louis==2.3.0 
lxml==2.3 
mechanize==0.1.11 
nvidia-common==0.0.0 
oauth==1.0.1 
onboard==0.96.1 
oneconf==0.2.6.7 
papyon==0.5.5 
pexpect==2.3 
piston-mini-client==0.6 
protobuf==2.4.0a 
psycopg2==2.4.4 
pyOpenSSL==0.12 
pycrypto==2.3 
pycups==1.9.59 
pycurl==7.19.0 
pyinotify==0.9.1 
pyparsing==1.5.2 
pyserial==2.5 
pysmbc==1.0.10 
python-apt==0.8.0ubuntu9 
python-dateutil==1.4.1 
python-debian==0.1.20ubuntu2 
python-virtkey==0.60.0 
pyxdg==0.19 
sessioninstaller==0.0.0 
simplejson==2.1.6 
system-service==0.1.6 
ubuntu-sso-client==1.4.0 
ubuntuone-couch==0.3.0 
ubuntuone-installer==2.0.0 
ubuntuone-storage-protocol==2.0.0 
ufw==0.30.1-2ubuntu1 
unattended-upgrades==0.1 
usb-creator==0.2.23 
virtualenv==1.6.4 
wadllib==1.2.0 
wsgiref==0.1.2 
xdiagnose==1.1 
xkit==0.0.0 
zope.interface==3.6.1 

Quando si distribuiscono su Heroku non riesce a Brlapi .....

Vedo molte cose dalla mia installazione Python principale che si trova su Ubuntu. Che è BAD dal momento che Ubuntu usa python per un bel po 'di cose (ubuntu-one, usb-creator, ecc.).

Non ho bisogno di loro su heroku! Ho bisogno solo di Django, psycopg2 e delle loro dipendenze. Non so nemmeno se è colpa di pip, o virutalenv. (Se vuoi conoscere il mio setup guarda il link sopra ho copiato nel terminale)

risposta

26

Questa è una cosa che mi ha infastidito troppo. Questo accade quando si crea un virtualenv senza il flag --no-site-packages.

Ci sono un paio di cose che si può fare:

  1. Creare virtualenv con la bandiera --no-site-packages.
  2. Durante l'installazione di app, non eseguire direttamente pip install <name>, aggiungere prima la libreria al numero requirements.txt, quindi installare i requisiti. Questo è più lento ma si assicura che i requisiti siano aggiornati.
  3. Elimina manualmente le librerie non necessarie. Una regola generale che seguo per questo è di aggiungere qualsiasi cosa ci sia nel mio INSTALLED_APPS e adattatori di database. La maggior parte delle altre librerie richieste verranno installate automaticamente a causa delle dipendenze. So che è sciocco, ma questo è quello che di solito faccio.

- Modifica -

Da allora ho scritto un couple of scripts per aiutare a gestire questo. Il primo esegue il blocco dei pip e aggiunge la libreria trovata a un file dei requisiti fornito, l'altro esegue l'installazione di pip e quindi lo aggiunge al file dei requisiti.

function pipa() { 
    # Adds package to requirements file. 
    # Usage: pipa <package> <path to requirements file> 
    package_name=$1 
    requirements_file=$2 
    if [[ -z $requirements_file ]] 
    then 
     requirements_file='./requirements.txt' 
    fi 
    package_string=`pip freeze | grep -i $package_name` 
    current_requirements=`cat $requirements_file` 
    echo "$current_requirements\n$package_string" | LANG=C sort | uniq > $requirements_file 
} 

function pipia() { 
    # Installs package and adds to requirements file. 
    # Usage: pipia <package> <path to requirements file> 
    package_name=$1 
    requirements_file=$2 
    if [[ -z $requirements_file ]] 
    then 
     requirements_file='./requirements.txt' 
    fi 
    pip install $package_name 
    pipa $package_name $requirements_file 
} 
+17

Nota: dal v. 1.7, virtualenv accetta '--no-site-packages' per impostazione predefinita, quindi non è necessario specificare tale opzione. È l'impostazione predefinita. Link: http://pypi.python.org/pypi/virtualenv#changes-news – Paolo

+0

Thx! --no-site-packages funziona bene! (Anche se sono ancora perplesso sul motivo per cui la squadra di heroku non l'abbia menzionata nei loro documenti). (E sì, ho usato il pacchetto fornito da Ubuntu 11.10 contenente virtualenv 1.6.4 :(:(:() –

+0

Se stai usando l'ultima versione di virtualenv, '--no-site-packages' non è più necessario. Consiglio vivamente di non affidarmi ai moduli python di aptitude :) –

10

Se si cura molto circa la pulizia del vostro requirements.txt non si deve solamente utilizzare l'opzione --no-site-packages come già accennato, ma anche non prendere in considerazione per pipe l'output di pip freeze direttamente sul tuo requirements.txt. Il motivo è che, quando si fa un pip freeze, non vengono mostrati solo i pacchetti specificati dall'utente stesso, ma anche le dipendenze installate da questi pacchetti! Non è necessario conservarli tutti nel tuo requirements.txt poiché verranno installati automaticamente con il pacchetto che li richiede ... Quindi se aggiungi un nuovo pacchetto al tuo virtualenv probabilmente dovresti semplicemente aggiungere la linea per questo pacchetto al tuo requirements.txt ...

Guarda questo esempio:

(demo)[~]$ pip freeze 
distribute==0.6.19 
wsgiref==0.1.2 
(demo)[~]$ pip install django-blog-zinnia 
Downloading/unpacking django-blog-zinnia 
    Downloading django-blog-zinnia-0.9.tar.gz (523Kb): 523Kb downloaded 
    Running setup.py egg_info for package django-blog-zinnia 

    no previously-included directories found matching 'docs/api' 
    no previously-included directories found matching 'docs/build' 
    no previously-included directories found matching 'docs/coverage' 
    no previously-included directories found matching 'zinnia/media/zinnia/css/.sass-cache' 
Downloading/unpacking BeautifulSoup>=3.2.0 (from django-blog-zinnia) 
    Downloading BeautifulSoup-3.2.1.tar.gz 
    Running setup.py egg_info for package BeautifulSoup 

    # truncated as it installs some more dependencies 
Successfully installed django-blog-zinnia BeautifulSoup django-mptt django-tagging django-xmlrpc pyparsing 
Cleaning up... 
(demo)[~]$ pip freeze 
BeautifulSoup==3.2.1 
distribute==0.6.19 
django-blog-zinnia==0.9 
django-mptt==0.5.2 
django-tagging==0.3.1 
django-xmlrpc==0.1.3 
pyparsing==1.5.6 
wsgiref==0.1.2 

(. Anche se forse dovrei detto che nella maggioranza dei casi non farà male che avete queste dipendenze lì, solo il file crescerà e ottenere più difficile da mantenere)

+0

Nah! Volevo solo una soluzione rapida per separare le mie librerie python relative al sistema operativo dalle mie librerie di sviluppo di django che dovrebbero essere installate sulla macchina di distribuzione! (imho comportamento predefinito di pip freeze dovrebbe essere cambiato ...) –

+3

Penso che tu assolutamente dovrebbe mantenere tutte le dipendenze indirette nel tuo requirements.txt in realtà, insieme con i loro numeri di versione il modo in cui le tue build sono ripetibili. Tenevo i miei requisiti diretti all'inizio del file e le mie dipendenze indirette ("transitive") nella parte inferiore. Ora li tengo tutti in un unico file, usando il freeze di pip per generare le informazioni, ma con commenti e in ordine alfabetico. – tobych

7

pipreqs risolve il problema. Genera il file a livello di progetto required.txt.

  • Installare pipreqs: pip install pipreqs
  • generare file a livello di progetto requirement.txt: pipreqs /path/to/your/project/ requisiti di file sarebbero stati salvati in /path/to/your/project/requirements.txt
+2

Controllato. Avrebbe fatto il lavoro abbastanza bene. –

+0

Purtroppo non funziona, crea dei requisiti ma mancano ancora alcuni moduli – Roman

+1

@Roman se usi virtualenv per eseguire il tuo progetto, assicurati di utilizzare pip che appartiene al virtualenv installazione 'pipreqs' – haifzhan

Problemi correlati