2011-10-11 8 views
11

utilizzando il seguente comando:È possibile ingannare l'installazione di pip --find-links nell'uso di un sdist scaricato per i requisiti --edabili?

pip install -r requirements.txt -d sdists/ 

È possibile creare facilmente un archivio di requisiti per la distribuzione con il progetto. Questa grande opera se le vostre esigenze simile a questa:

Django==1.3.1 
django-tagging==0.3.1 
django-robots==0.6.1 

È possibile quindi installare tali requisiti senza toccare PyPI a tutti, in questo modo:

pip install -r requirements.txt --find-links sdists/ --no-index 

E 'possibile utilizzare lo stesso metodo per --editable requisiti ? Ad esempio:

-e hg+https://bitbucket.org/ubernostrum/django-contact-form/@1d3791fa4dfb#egg=django-contact-form 

Per quanto posso dire, pip install -d download felicemente requisiti modificabili e crea uno sdist per voi, ma pip install --find-links non ha alcun modo di abbinare lo sdist scaricato con la linea associata nel file esigenze, quindi ignora il sdist scaricato e continua a controllare il codice da VCS come al solito.

+0

potresti provare a impostare 'PIP_DOWNLOAD_CACHE' in qualche directory. Funziona con i tarball 'tip' di bitbucket. Ma dubito che funzioni per '@ revision # egg = package'. – jfs

+0

C'è un modo per specificare il tipo di sistema operativo? Sto lavorando su un Mac, ma voglio i download per Centos (ad es. Cryptography-1.8.1-cp27-cp27m-macosx_10_10_intel.whl o cffi-1.10.0-cp27-cp27m-macosx_10_6_intel.whl) – myloginid

+0

C'è una caratteristica poco conosciuta di specificando la versione di un uovo come questo '(...) # egg = django-contact-form == xyz'. Forse questo sarebbe di aiuto qui. Il problema è che la gestione di '--find-links' è fatta da setuptools e non da pip e questo rende molte cose difficili o impossibili. –

risposta

4

Mentre non sembra che questo sia strettamente possibile utilizzando PIP, c'è una soluzione che realizza la stessa cosa. La soluzione alternativa consiste nel generare automaticamente un secondo file di requisiti dal file dei requisiti originali e dalla directory sdists (da utilizzare solo per tale directory).

Una semplice implementazione potrebbe essere simile a questo (salva in un file chiamato "make_reqs.py"):

#!/usr/bin/env python 

import re 
import sys 
import os.path 

pat = '.+#egg=(.+)' 
allowed_exts = ['.zip', '.tar.gz', 'tar.bz2'] 

def find_version(sdists_dir, name): 
    files = [f for f in os.listdir(sdists_dir) if f.startswith(name)] 
    if len(files) != 1: 
     return '' 
    version = files[0].replace(name+'-', '') 
    for ext in allowed_exts: 
     version = version.replace(ext, '') 
    return version 

def get_requirements(file_name, sdists_dir): 
    out_reqs = ['--find-links file://%s' % os.path.abspath(sdists_dir)] 
    with open(file_name) as req_file: 
     reqs = [l.strip() for l in req_file.readlines()] 
     for req in reqs: 
      match = re.match(pat, req) 
      if match and not req.startswith('#'): 
       name = match.group(1) 
       version = find_version(sdists_dir, name) 
       if version: 
        out_reqs.append('%s==%s' % (name, version)) 
       else: 
        out_reqs.append(req) 
      else: 
       out_reqs.append(req) 
    return out_reqs 

if __name__ == '__main__': 
    print '\n'.join(get_requirements(*sys.argv[1:])) 

Per utilizzare lo script, si potrebbe fare qualcosa di simile:

python make_reqs.py requirements.txt /path/to/sdists > sdist_reqs.txt 
pip install --no-index -r sdist_reqs.txt