2011-10-11 11 views
11

:- Steril gereksinimler için pip install --find-linklerini indirilmiş bir sdist kullanarak kandırmak mümkün mü? Aşağıdaki komutu kullanarak

pip install -r requirements.txt -d sdists/ 

kolayca proje ile dağıtmak için gereksinimlerin bir arşiv oluşturabilirsiniz. Ardından şöyle, hiç PyPI dokunmadan bu gereksinimleri yükleyebilir

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

:

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

o --editable gereksinimleri için aynı yöntemi kullanmak mümkün mü sizin gereksinimleri şu şekilde görünür, bu harika çalışıyor ? Ör:

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

Bildiğim kadarıyla söyleyebilirim, pip install -d mutlu bir gereklilik dosyasında ilişkili çizgi ile indirilen Sdist maç için herhangi bir yol yoktur düzenlenebilir gereksinimleri indirir ve sizin için Sdist oluşturur, ancak pip install --find-links, Bu yüzden indirilen sdist'i yok sayar ve her zamanki gibi VCS'den kodu kontrol etmeye devam eder.

+0

Bazı dizine 'PIP_DOWNLOAD_CACHE 'ayarlamayı deneyebilirsiniz. Bitbucket'in 'ipucu' tarball'ları için çalışıyor. Ama bunun 'revizyon # yumurta = paket' için çalıştığından şüpheliyim. – jfs

+0

İşletim Sistemi Türünü belirtmenin bir yolu var mı? Ben bir Mac üzerinde çalışıyorum, ama Centos için indirme (örneğin kriptografi-1.8.1-cp27-cp27m-macosx_10_10_intel.whl veya cffi-1.10.0-cp27-cp27m-macosx_10_6_intel.whl) – myloginid

+0

az bilinen bir özelliği var bir yumurtanın versiyonunu şöyle belirtebiliriz: (...) # egg = django-contact-form == xyz'. Belki bu burada yardımcı olur. Sorun, '--find-link'lerin ele alınması, setuptools tarafından yapılmakta ve pipetlenmemekte ve bu pek çok şeyi zor ya da imkansız hale getirmektedir. –

cevap

4

Bu, PIP kullanılarak kesinlikle mümkün görünmese de, aynı şeyi gerçekleştiren bir geçici çözüm vardır. Çözüm, otomatik olarak ikinci gereksinim dosyasını orijinal gereksinim dosyasından ve sdists dizininden (yalnızca bu dizin için kullanılacak) oluşturmaktır.

Basit uygulama böyle bir şey (adında bir dosya "make_reqs.py" kaydetmek) görünebilir:

#!/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:])) 

komut dosyasını kullanmak için, böyle bir şey yapacağını:

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