2011-10-11 30 views
11

Sử dụng lệnh sau:Có thể lừa pip install --find-link vào sử dụng sdist đã tải xuống cho các yêu cầu --editable không?

pip install -r requirements.txt -d sdists/ 

Bạn có thể dễ dàng tạo ra một kho lưu trữ các yêu cầu để phân phối với dự án của bạn. Này hoạt động tuyệt vời nếu yêu cầu của bạn trông như thế này:

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

Sau đó bạn có thể cài đặt những yêu cầu mà không cần chạm PyPI ở tất cả, như vậy:

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

Có thể sử dụng phương pháp tương tự cho --editable yêu cầu ? Ví dụ:

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

Theo như tôi có thể nói, pip install -d hạnh phúc tải các yêu cầu chỉnh sửa và tạo ra một sdist cho bạn, nhưng pip install --find-links không có cách nào để phù hợp với các sdist tải với dòng liên quan trong hồ sơ yêu cầu của bạn, vì vậy nó bỏ qua các sdist tải về và tiếp tục kiểm tra ra mã từ VCS như bình thường.

+0

bạn có thể thử đặt 'PIP_DOWNLOAD_CACHE' thành một số thư mục. Nó hoạt động với các bitball 'tip' của bitbucket. Nhưng tôi nghi ngờ rằng nó hoạt động cho '@ revision # egg = package'. – jfs

+0

Có cách nào để chỉ định Loại hệ điều hành không? Tôi đang làm việc trên máy Mac, nhưng muốn tải xuống cho Centos (ví dụ: mật mã-1.8.1-cp27-cp27m-macosx_10_10_intel.whl hoặc cffi-1.10.0-cp27-cp27m-macosx_10_6_intel.whl) – myloginid

+0

Có một tính năng ít được biết đến của xác định phiên bản của một quả trứng như thế này (...) # egg = django-contact-form == xyz'. Có lẽ điều này sẽ giúp ích ở đây. Vấn đề là xử lý '--find-links' được thực hiện bởi setuptools và không phải pip chính nó và điều này làm cho nhiều điều khó khăn hoặc không thể. –

Trả lời

4

Mặc dù dường như điều này hoàn toàn không thể xảy ra khi sử dụng PIP, có một giải pháp thay thế hoàn thành cùng một điều. Giải pháp thay thế là tự động tạo tệp yêu cầu thứ hai từ tệp yêu cầu ban đầu và thư mục sdists (chỉ được sử dụng cho thư mục đó).

Một thực hiện đơn giản có thể giống như thế này (lưu trong một tập tin gọi là "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:])) 

Để sử dụng kịch bản, bạn sẽ làm một cái gì đó như thế này:

python make_reqs.py requirements.txt /path/to/sdists > sdist_reqs.txt 
pip install --no-index -r sdist_reqs.txt 
Các vấn đề liên quan