2011-10-11 2 views
11

En utilisant la commande suivante:Est-il possible de tromper pip -find-links en utilisant un sdist téléchargé pour -editable exigences?

pip install -r requirements.txt -d sdists/ 

Vous pouvez facilement créer une archive des exigences pour la distribution de votre projet. Cela fonctionne très bien si vos besoins se présentent comme suit:

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

Vous pouvez ensuite installer ces exigences sans toucher PyPI du tout, comme ceci:

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

Est-il possible d'utiliser la même méthode pour --editable exigences ? Par exemple:

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

Pour autant que je peux dire, pip install -d télécharge heureusement les exigences modifiables et crée un sdist pour vous, mais pip install --find-links n'a pas de moyen de faire correspondre le sdist téléchargé avec la ligne associée dans votre fichier d'exigences, donc il ignore le SDist téléchargé et continue de vérifier le code de VCS comme d'habitude.

+0

vous pourriez essayer de mettre 'PIP_DOWNLOAD_CACHE' dans un répertoire. Cela fonctionne pour les tarballs 'tip' de bitbucket. Mais je doute que cela fonctionne pour '@ revision # egg = package'. – jfs

+0

Existe-t-il un moyen de spécifier le type de système d'exploitation? Je suis workin sur un Mac, mais je veux les téléchargements pour Centos (par exemple cryptography-1.8.1-cp27-cp27m-macosx_10_10_intel.whl ou cffi-1.10.0-cp27-cp27m-macosx_10_6_intel.whl) – myloginid

+0

Il y a une caractéristique peu connue de en spécifiant la version d'un oeuf comme ceci '(...) # egg = django-contact-form == xyz'. Peut-être que cela aiderait ici. Le problème est que la manipulation de '--find-links' est faite par setuptools et ne se pique pas elle-même, ce qui rend beaucoup de choses difficiles ou impossibles. –

Répondre

4

Bien qu'il ne semble pas que ce soit strictement possible en utilisant PIP, il existe une solution de contournement qui accomplit la même chose. La solution consiste à générer automatiquement un second fichier d'exigences à partir du fichier des exigences d'origine et du répertoire sdists (à utiliser uniquement pour ce répertoire).

Une implémentation simple pourrait ressembler à ceci (sauf dans un fichier appelé "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:])) 

Pour utiliser le script, vous feriez quelque chose comme ceci:

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