2010-11-11 39 views
21

Tôi muốn pip cài đặt một phụ thuộc mà tôi có trên GitHub khi người dùng ra lệnh cài đặt phần mềm gốc, cũng từ nguồn trên GitHub. Cả hai gói này đều không có PyPi (và sẽ không bao giờ có).Có thể cài đặt Pip phụ thuộc không được chỉ định trong setup.py lúc cài đặt không?

Người dùng phát lệnh:

pip -e git+https://github.com/Lewisham/[email protected]#egg=cvsanaly 

repo này có một tập tin requirements.txt, với một sự phụ thuộc vào GitHub:

-e git+https://github.com/Lewisham/repositoryhandler#egg=repositoryhandler 

Những gì tôi muốn là một đơn lệnh rằng một người dùng có thể phát hành để cài đặt gói ban đầu, có pip tìm tập tin yêu cầu, sau đó cài đặt phụ thuộc quá.

Trả lời

36

This answer đã giúp tôi giải quyết cùng một vấn đề bạn đang nói đến.

Có vẻ như không phải là cách dễ dàng để setup.py sử dụng tệp yêu cầu trực tiếp để xác định các phụ thuộc của nó, nhưng cùng một thông tin có thể được đưa vào chính setup.py.

Tôi có requirements.txt này:

PIL 
-e git://github.com/gabrielgrant/django-ckeditor.git#egg=django-ckeditor 

Nhưng khi cài đặt gói chứa của requirements.txt đó, các yêu cầu được bỏ qua bởi pip.

setup.py Điều này dường như ép buộc pip vào cài đặt phụ thuộc (bao gồm cả phiên bản github của tôi về django-ckeditor):

from setuptools import setup 

setup(
    name='django-articles', 
    ..., 
    install_requires=[ 
     'PIL', 
     'django-ckeditor>=0.9.3', 
    ], 
    dependency_links = [ 
     'http://github.com/gabrielgrant/django-ckeditor/tarball/master#egg=django-ckeditor-0.9.3', 
    ] 
) 

Edit:

This answer cũng chứa một số thông tin hữu ích.

Chỉ định phiên bản là một phần của "#egg = ..." là bắt buộc để xác định phiên bản của gói có sẵn tại liên kết. Lưu ý, tuy nhiên, nếu bạn luôn muốn phụ thuộc vào phiên bản mới nhất, bạn có thể thiết lập các phiên bản để dev trong install_requires, dependency_links và setup.py gói khác của

Edit: sử dụng dev như các phiên bản isn không phải là một ý tưởng hay, theo nhận xét dưới đây.

+3

mẹo với "dev" chỉ hoạt động lần đầu tiên chứ không phải lần sau. Setup.py chỉ kiểm tra chuỗi "dev" làm phiên bản cho chính nó – DanEEStar

+2

@DanEEStar Đúng vậy. Khi phiên bản _dev_ của gói đã được cài đặt, 'setuptools' sẽ xem xét yêu cầu thỏa mãn. Như đã trình bày [trong câu trả lời được liên kết] (http://stackoverflow.com/a/2163919/396967), bạn cần đồng bộ cập nhật phiên bản gói trong * tất cả 3 địa điểm *: 'setup.py' và' install_requires' của phụ thuộc và 'dependency_links' - không thực sự thực tế. – kynan

+1

yup, @DanEEStar bạn nói đúng. Tôi đã chỉnh sửa đề xuất sử dụng phiên bản 'dev'. Cảm ơn hai bạn! –

12

Đây là tập lệnh nhỏ mà tôi đã sử dụng để tạo install_requiresdependency_links từ tệp yêu cầu.

import os 
import re 

def which(program): 
    """ 
    Detect whether or not a program is installed. 
    Thanks to http://stackoverflow.com/a/377028/70191 
    """ 
    def is_exe(fpath): 
     return os.path.exists(fpath) and os.access(fpath, os.X_OK) 

    fpath, _ = os.path.split(program) 
    if fpath: 
     if is_exe(program): 
      return program 
    else: 
     for path in os.environ['PATH'].split(os.pathsep): 
      exe_file = os.path.join(path, program) 
      if is_exe(exe_file): 
       return exe_file 

    return None 

EDITABLE_REQUIREMENT = re.compile(r'^-e (?P<link>(?P<vcs>git|svn|hg|bzr).+#egg=(?P<package>.+)-(?P<version>\d(?:\.\d)*))$') 

install_requires = [] 
dependency_links = [] 

for requirement in (l.strip() for l in open('requirements')): 
    match = EDITABLE_REQUIREMENT.match(requirement) 
    if match: 
     assert which(match.group('vcs')) is not None, \ 
      "VCS '%(vcs)s' must be installed in order to install %(link)s" % match.groupdict() 
     install_requires.append("%(package)s==%(version)s" % match.groupdict()) 
     dependency_links.append(match.group('link')) 
    else: 
     install_requires.append(requirement) 
1

điều này có trả lời câu hỏi của bạn không?

setup(name='application-xpto', 
    version='1.0', 
    author='me,me,me', 
    author_email='[email protected]', 
    packages=find_packages(), 
    include_package_data=True, 
    description='web app', 
    install_requires=open('app/requirements.txt').readlines(), 
) 
+2

'open ('app/requirements.txt') readlines()' chỉ hoạt động nếu 'requirements.txt' chỉ chứa thông số phiên bản" đơn giản ", không phải URL. Những điều này sẽ cần phải được tách ra trong 'dependency_links' như được thực hiện bởi câu trả lời của Simon Charette. – kynan

Các vấn đề liên quan