2011-10-11 2 views
11

:pip 설치 --find-links를 편집 가능한 sdist로 편집하는 것을 속일 수 있습니까? 다음 명령을 사용하여

pip install -r requirements.txt -d sdists/ 

당신은 쉽게 프로젝트를 배포하는 요구 사항의 아카이브를 생성 할 수 있습니다. 당신은 다음과 같이 전혀 PyPI을 건드리지 않고 이러한 요구 사항을 설치할 수 있습니다

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

:

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

--editable 요구 사항에 대해 동일한 방법을 사용할 수 있습니다 귀하의 요구 사항은 다음과 같이 경우에 좋은 작품 ? 예는 :

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

지금까지 내가 말할 수있는, pip install -d 즐겁게 요구 사항 파일에 연결된 줄을 다운로드 sdist을 일치 할 수있는 방법이없는 편집 가능한 요구 사항을 다운로드하고 당신을 위해 sdist을 만들지 만 pip install --find-links, 따라서 다운로드 된 sdist를 무시하고 평소처럼 VCS에서 코드를 체크 아웃합니다.

+0

당신은 어떤 디렉토리에'PIP_DOWNLOAD_CACHE'를 설정하려고 할 수 있습니다. 그것은 bitbucket의'tip' tarball을 위해 작동합니다. 그러나 나는'@revision # egg = package'에서 작동하는지 의심 스럽다. – jfs

+0

OS 유형을 지정하는 방법이 있습니까? 나는 Mac에서 일하고 있지만 Centos에 대한 다운로드를 원합니다 (예 : cryptography-1.8.1-cp27-cp27m-macosx_10_10_intel.whl 또는 cffi- 1.10.0-cp27-cp27m-macosx_10_6_intel.whl) – myloginid

+0

이'(...) # egg = django-contact-form == xyz'와 같은 달걀의 버전을 지정하십시오. 아마 여기가 도움이 될 것입니다. 문제는'--find-links'를 다루는 것이 setuptools에 의해 이루어지며 pip 자체가 아니라 많은 것들을 어렵게하거나 불가능하게 만듭니다. –

답변

4

PIP를 사용하는 것이 엄격하게 가능하지는 않지만 동일한 문제를 해결할 수있는 해결 방법이 있습니다. 해결책은 원래 요구 사항 파일 및 sdists 디렉토리 (해당 디렉토리에만 사용됨)에서 두 번째 요구 사항 파일을 자동으로 생성하는 것입니다.

간단한 구현이이 같은 (라는 파일 "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:])) 

스크립트를 사용하려면를, 당신은 같은 것을 할 것입니다 :

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