2010-11-11 18 views
21

मैं पिप चाहता हूं कि मेरे पास गिटहब पर निर्भरता स्थापित हो, जब उपयोगकर्ता मूल सॉफ्टवेयर स्थापित करने के लिए आदेश जारी करता है, गीताबब पर स्रोत से भी। इनमें से कोई भी पैकेज Pypi पर नहीं है (और कभी नहीं होगा)।इंस्टॉल स्थापित समय पर set.py में निर्दिष्ट निर्भरता स्थापित पिप स्थापित कर सकते हैं?

उपयोगकर्ता आदेश जारी करता है:

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

इस रेपो, एक requirements.txt फ़ाइल है GitHub पर एक और निर्भरता के साथ:

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

क्या मैं चाहता हूँ एक एकल आदेश है कि एक उपयोगकर्ता मूल पैकेज को स्थापित करने के लिए जारी कर सकते हैं, पीआईपी को आवश्यकता फाइल ढूंढें, फिर भी निर्भरता स्थापित करें।

उत्तर

36

This answer जिस समस्या के बारे में आप बात कर रहे हैं उसे हल करने में मेरी मदद की।

सेटअप.py को इसकी निर्भरताओं को परिभाषित करने के लिए सीधे सेटिंग फ़ाइल का उपयोग करने का एक आसान तरीका प्रतीत नहीं होता है, लेकिन उसी जानकारी को setup.py में ही रखा जा सकता है।

मैं इस requirements.txt है:

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

लेकिन जब कि requirements.txt के युक्त पैकेज को स्थापित करने, आवश्यकताओं पिप द्वारा नजरअंदाज कर दिया जाता है।

यह setup.py (Django-CKEditor की मेरी GitHub संस्करण सहित) निर्भरता स्थापित करने में पिप मजबूर करने के लिए लगता है:

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', 
    ] 
) 

संपादित करें:

This answer भी कुछ उपयोगी जानकारी शामिल है।

"#egg = ..." के हिस्से के रूप में संस्करण निर्दिष्ट करना यह जानने के लिए आवश्यक है कि पैकेज का कौन सा संस्करण लिंक पर उपलब्ध है। ध्यान दें, तथापि, अगर आप हमेशा अपने नवीनतम संस्करण पर निर्भर करना चाहते हैं, तो आप install_requires में dev के संस्करण निर्धारित कर सकते हैं कि, dependency_links और अन्य पैकेज के setup.py

संपादित करें: संस्करण प्रतिसाद नहीं के रूप में dev का उपयोग कर नीचे टिप्पणी के अनुसार, एक अच्छा विचार नहीं है।

+3

"देव" के साथ चाल केवल पहली बार काम करती है, न कि बाद के समय। Setup.py केवल "dev" स्ट्रिंग को अपने लिए एक संस्करण के रूप में देखता है – DanEEStar

+2

@DanEEStar यह सही है। एक बार पैकेज का _dev_ संस्करण स्थापित हो गया है 'setuptools' आवश्यकता को संतुष्ट करेगा। जैसा कि [लिंक किए गए उत्तर में] दिखाया गया है (http://stackoverflow.com/a/2163919/396967) आपको * सभी 3 स्थानों * में पैकेज संस्करण को सिंक्रनाइज़ करने की आवश्यकता होगी: निर्भरता की 'setup.py' और' install_requires' और 'निर्भरता_लिंक्स' - वास्तव में व्यावहारिक नहीं है। – kynan

+1

yup, @DanEEStar आप सही हैं। मैंने 'dev' संस्करण का उपयोग करने की सिफारिश संपादित की है। धन्यवाद आप दो! –

12

यहां एक छोटी सी स्क्रिप्ट है जिसका उपयोग मैं install_requires और dependency_links को एक आवश्यकता फ़ाइल से उत्पन्न करने के लिए करता था।

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

क्या यह आपके प्रश्न का उत्तर देता है?

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

'ओपन (' ऐप/आवश्यकताएंटीटीटी ')। रीडलाइन()' केवल तभी काम करता है जब 'requirements.txt' में केवल" सादे "संस्करण विनिर्देश होते हैं, न कि URL। साइमन चैरेट के जवाब के अनुसार इन्हें 'निर्भरता_लिंक्स' में विभाजित करने की आवश्यकता होगी। – kynan

संबंधित मुद्दे