पायथन सेटपॉल्स: मैं install_requires के तहत एक निजी भंडार कैसे सूचीबद्ध कर सकता हूं?


85

मैं setup.pyएक प्रोजेक्ट के लिए एक फाइल बना रहा हूं जो निजी GitHub रिपॉजिटरी पर निर्भर करता है। फ़ाइल के संबंधित भाग इस तरह दिखते हैं:

from setuptools import setup
setup(name='my_project',
    ...,
    install_requires=[
        'public_package',
        'other_public_package',
        'private_repo_1',
        'private_repo_2',
    ],
    dependency_links=[
        'https://github.com/my_account/private_repo_1/master/tarball/',
        'https://github.com/my_account/private_repo_2/master/tarball/',
    ],
    ...,
)

मैं setuptoolsइसके बजाय उपयोग कर रहा हूं distutilsक्योंकि उत्तरार्द्ध इस उत्तर के अनुसार install_requiresऔर dependency_linksतर्कों का समर्थन नहीं करता है ।

उपरोक्त सेटअप फ़ाइल 404 त्रुटि के साथ निजी रिपोज को एक्सेस करने में विफल रहती है - जो कि उम्मीद की जानी है क्योंकि गिथब एक निजी रिपॉजिटरी के लिए अनधिकृत अनुरोधों पर 404 लौटाता है। हालाँकि, मैं यह setuptoolsप्रमाणित नहीं कर सकता कि कैसे प्रमाणित किया जाए।

यहाँ कुछ चीजें हैं जो मैंने कोशिश की हैं:

  1. का प्रयोग करें git+ssh://बजाय https://में dependency_linksके रूप में मैं अगर साथ रेपो स्थापित करने होगा pip। यह विफल हो जाता है क्योंकि सेटप्टूल इस प्रोटोकॉल ("अज्ञात url प्रकार: git + ssh") को नहीं पहचानते हैं, हालांकि वितरित प्रलेखन का कहना है कि इसे चाहिए। डिट्टो git+httpsऔर git+http

  2. https://<username>:<password>@github.com/...- अभी भी एक 404 मिलता है। (यह विधि कमांड लाइन के साथ curlया wgetतो curl -u <username> <repo_url> -O <output_file_name>काम नहीं करती है - हालांकि काम करती है।)

  3. नवीनतम संस्करण के लिए सेटअपस्टूल (0.9.7) और वर्चुअनव (1.10) को अपग्रेड करना। हालांकि यह अवलोकन कहता है कि इसे स्थापित करने का प्रयास किया गया था, लेकिन इसे वापस सेटप्टूल में मिला दिया गया था। किसी भी तरह, कोई पासा नहीं।

वर्तमान में मेरे पास केवल setup.pyएक चेतावनी है कि निजी रिपॉज को अलग से डाउनलोड किया जाना चाहिए। यह स्पष्ट रूप से आदर्श से कम है। मुझे ऐसा लगता है कि कुछ स्पष्ट है जो मुझे याद आ रहा है, लेकिन यह नहीं सोच सकता कि यह क्या हो सकता है। :)

यहाँ कोई जवाब नहीं के साथ डुप्लिकेट-ईश प्रश्न ।


कृपया एक समाधान स्वीकार करें।
wieczorek1990

जवाबों:


69

मैं इसे पाइप के साथ स्थापित करने के लिए काम करने की कोशिश कर रहा था, लेकिन उपरोक्त मेरे लिए काम नहीं कर रहा था। [१] से मैं समझता था कि PEP508मानक का उपयोग किया जाना चाहिए, [२] से मैंने एक उदाहरण प्राप्त किया जो वास्तव में काम करता है (कम से कम मेरे मामले के लिए)।

कृपया ध्यान दें; इस पर साथ pip 20.0.2हैPython 3.7.4

setup(
    name='<package>',
...
    install_requires=[
        '<normal_dependency>',
         # Private repository
        '<dependency_name> @ git+ssh://git@github.com/<user>/<repo_name>@<branch>',
         # Public repository
        '<dependency_name> @ git+https://github.com/<user>/<repo_name>@<branch>',
    ],
)

मेरे पैकेज को निर्दिष्ट करने के बाद इस तरह से स्थापना ठीक काम करती है ( -eसेटिंग्स के साथ और निर्दिष्ट किए बिना भी --process-dependency-links)।

सन्दर्भ [१] https://github.com/pypa/pip/issues/4187 [२] https://github.com/pypa/pip/issues/5566


#egg=...हिस्सा अब अनावश्यक लगते हैं।
हुअज़ुओ गाओ

1
धन्यवाद! आप बिल्कुल सही कह रहे हैं, दोनों #eggऔर branchवैकल्पिक हैं (संपादित देखें) और यह भी के लिए काम करता है git+https
टॉम हेम्स डे

1
यदि आप अपने क्लोन url ssh://में Could not resolve hostnameपरिवर्तन के :लिए उपयोग करते हैं और चलाते हैं /। मुझे गिटलैब के साथ यह त्रुटि आई थी।
डेलीजटी

11
यह अब काम नहीं करता है क्योंकि सेटपूलों को निर्भरता नाम के साथ PyPi पर एक पैकेज की तलाश है: Reading https://pypi.org/simple/some-fake-name/और फिर Couldn't find index page for 'some_fake_name' (maybe misspelled?)। अंत में, प्रदर्शित अंतिम त्रुटि हैerror: Could not find suitable distribution for Requirement.parse('some_fake_name@ git+ssh://git@github.com/cglacet/quadtree.git')
cglacet

1
जोर दिया गया कि <dependency_name> <repo_name> के समान नहीं है और आप 'ssh: // git @' को 'https: //' से बदल सकते हैं यदि यह सार्वजनिक रेपो है
Phil P

41

यहाँ मेरे लिए क्या काम किया गया है:

  install_requires=[
      'private_package_name==1.1',
  ],
  dependency_links=[
      'git+ssh://git@github.com/username/private_repo.git#egg=private_package_name-1.1',
  ]

ध्यान दें कि आपके पास अंडे के नाम में संस्करण संख्या होनी चाहिए, अन्यथा यह कहेगा कि यह पैकेज नहीं पा सकता है।


3
हाय vadimg - सेप्टुपूलस / डिस्ट्रीब्यूशन के कौन से संस्करण का आप उपयोग कर रहे हैं? मुझे 0.7.3 (नवीनतम संस्करण) वितरण का उपयोग करके "अज्ञात url प्रकार: git + ssh" मिलता है।
एरिक पी

2
यह मेरे लिए 3 साल बाद काम नहीं आया ... समझे: एक ऐसा संस्करण नहीं मिला जो आवश्यकता को पूरा करता हो
jsmedmar

7
28 अक्टूबर, 2016 तक, यह दृष्टिकोण टूट गया है
अधिकतम

1
आधुनिक पाइप के साथ आपको एक विकल्प शामिल करने की आवश्यकता है, जैसे कुछpip install --process-dependency-links ...
ऐश बर्लिन-टेलर

2
--process-dpendency-linksघटाया हुआ है, PEP508 url विनिर्देशन का उपयोग करके मेरा उत्तर देखें
टॉम हेम्स

10

मुझे इस पर कोई अच्छा दस्तावेज नहीं मिला, लेकिन मुख्य रूप से परीक्षण और त्रुटि के माध्यम से हल किया गया। इसके अलावा, पाइप और सेटपूल से स्थापित करने के कुछ सूक्ष्म अंतर हैं; लेकिन इस तरह से दोनों के लिए काम करना चाहिए।

GitHub नहीं (वर्तमान में, अगस्त 2016 के रूप में) निजी रेपो के जिप / टारबॉल प्राप्त करने का एक आसान तरीका प्रदान करता है। इसलिए आपको सेटटॉप्स को यह बताने की जरूरत है कि आप एक सेट रेपो की ओर इशारा कर रहे हैं:

from setuptools import setup
import os
# get deploy key from https://help.github.com/articles/git-automation-with-oauth-tokens/
github_token = os.environ['GITHUB_TOKEN']

setup(
    # ...
    install_requires='package',
    dependency_links = [
    'git+https://{github_token}@github.com/user/{package}.git/@{version}#egg={package}-0'
        .format(github_token=github_token, package=package, version=master)
        ] 

नोटों की एक जोड़ी यहाँ:

  • निजी रेपो के लिए, आपको गिटहब के साथ प्रमाणित करने की आवश्यकता है; मैंने जो सबसे आसान तरीका पाया, वह यह है कि एक ऊहुट टोकन बनाया जाए, जो आपके वातावरण में गिरा हो, और फिर उसे URL के साथ शामिल करें
  • आपको लिंक के अंत में कुछ संस्करण संख्या (यहाँ है 0) शामिल करने की आवश्यकता है , भले ही PyPI पर कोई पैकेज न हो। इसके लिए वास्तविक संख्या होनी चाहिए, शब्द नहीं।
  • आपको git+यह बताने की ज़रूरत है कि सेटटॉप्स को यह बताने की ज़रूरत है कि रेपो को क्लोन करना है, बजाय एक जिप / टरबॉल को इंगित करने के लिए
  • version एक शाखा, एक टैग या एक प्रतिबद्ध हैश हो सकता है
  • यदि आपको --process-dependency-linksपाइप से इंस्टॉल करना है तो आपको आपूर्ति करनी होगी

मुझे टैग या शाखा संदेश नहीं मिल रहा है। इस तथ्य के बावजूद कि मैं जिस निजी रेपो का क्लोन बनाने का प्रयास कर रहा हूं, उसमें एक टैग है।
ट्रेंडसेटर

1
पता लगाया कि समस्या क्या थी। इस टैग ने vइसे जीथब में प्रस्तुत किया था। इसलिए मुझे अपनी setup.py स्क्रिप्ट के v1.1.0बजाय उपयोग करने की आवश्यकता थी 1.1.0
ट्रेंडसेटर

4

मुझे एक (हैक) वर्कअराउंड मिला:

#!/usr/bin/env python

from setuptools import setup
import os

os.system('pip install git+https://github-private.corp.com/user/repo.git@master')

setup( name='original-name'
     , ...
     , install_requires=['repo'] )

मैं समझता हूं कि सेटअप स्क्रिप्ट में एक सिस्टम कॉल होने के साथ नैतिक मुद्दे हैं, लेकिन मैं ऐसा करने का दूसरा तरीका नहीं सोच सकता।


हाँ यह निम्न के कारण भी हमारे लिए एक बदसूरत वर्कअराउंड था: github.com/pypa/pip/issues/2822
टॉमी

यह एकमात्र तरीका है जो मुझे काम करने के लिए मिल सकता है, हालांकि मैं साथ गया था import pip। न तो @ vadimg का जवाब या pypa / pip में इस सुझाव ने काम किया।
जेन्स

4
इस तरह की स्थापना के लिए असंबंधित कुछ चल रहा है, भले ही यह एक निर्भरता स्थापित करेगा python setup.py --version
WhyNotHugo

1

वाया टॉम हेम्स का जवाब मुझे यही मिला जो मेरे लिए काम करता है:

    install_requires=[
        '<package> @ https://github.com/<username>/<package>/archive/<branch_name>.zip']

0

सार्वजनिक रिपॉजिटरी के लिए जीथब से संग्रह URL का उपयोग करना मेरे लिए काम करता है। उदाहरण के लिए

dependency_links = [
  'https://github.com/username/reponame/archive/master.zip#egg=eggname-version',
]

आप कैसे पाते हैं eggname-version?
cglacet

-1

संपादित करें: यह केवल सार्वजनिक गीथूब रिपॉजिटरी के साथ काम करने के लिए प्रतीत होता है, टिप्पणियां देखें।

dependency_links=[
    'https://github.com/my_account/private_repo_1/tarball/master#egg=private_repo_1',
    'https://github.com/my_account/private_repo_2/tarball/master#egg=private_repo_2',
],

उपर्युक्त वाक्य रचना 1.0 के साथ मेरे लिए काम करने लगता है। इस समय कम से कम VCS निर्भरता में "# अंडा = प्रोजेक्ट_नाम-संस्करण" जोड़ने का सिंटैक्स आपको दस्तावेज़ वितरित करने के लिए दिए गए लिंक में प्रलेखित है


मुझे अभी भी वही 404 त्रुटि मिली है। क्या आपके मामले में पुनर्खरीद निजी है? मैं # अंडा = वाक्य रचना से अवगत हूँ लेकिन यह नहीं जानता कि यह प्रमाणीकरण को प्रभावित करता है।
एरिक पी।

क्षमा करें, यह निश्चित रूप से एक सार्वजनिक रेपो परियोजना थी। शायद वर्तमान सेट-अप के साथ ऐसा करने का कोई तरीका नहीं है अगर https // <username>: <पासवर्ड> @ ... ... टारबॉल यूआरएल githubs निजी रिपॉजिटरी के साथ काम नहीं करते हैं क्योंकि यह प्रश्न यह भी इंगित करता है: होने-परेशानी-
wor

आप सेटपूल के विकास संस्करण को भी आज़मा सकते हैं और / या कोड की जांच कर सकते हैं। प्रासंगिक कोड लगता है: package_index: fetch_distribution (): 534 package_index.py:_download_url():736
wor

-2

हमारे परिदृश्य के लिए यह काम:

  1. पैकेज एक निजी रेपो में जीथूब पर है
  2. हम इसे साइट-पैकेजों में स्थापित करना चाहते हैं (नहीं ./src with -e)
  3. pip install -r आवश्यकताओं का उपयोग करने में सक्षम होने के नाते
  4. पिप स्थापित -इ रिपोसिर (या गितूब से) का उपयोग करने में सक्षम होने के नाते, जहां निर्भरता केवल आवश्यकताओं में निर्दिष्ट होती हैं।

https://github.com/pypa/pip/issues/3610#issuecomment-356687173

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.