एक निर्भरता के रूप में Git रिपॉजिटरी को शामिल करने के लिए setup.py कैसे लिखें


100

मैं setup.pyअपने पैकेज के लिए लिखने की कोशिश कर रहा हूं। मेरे पैकेज को एक अन्य गिट रिपॉजिटरी पर निर्भरता निर्दिष्ट करने की आवश्यकता है।

अभी तक मेरे पास इतना ही है:

from setuptools import setup, find_packages

setup(
    name='abc',
    packages=find_packages(),
    url='https://github.abc.com/abc/myabc',
    description='This is a description for abc',
    long_description=open('README.md').read(),
    install_requires=[
        "requests==2.7.0",
        "SomePrivateLib>=0.1.0",
        ],
    dependency_links = [
     "git+git://github.abc.com/abc/SomePrivateLib.git#egg=SomePrivateLib",
    ],
    include_package_data=True,
)

जब मैं चलता हूं:

pip install -e https://github.abc.com/abc/myabc.git#egg=analyse

मुझे मिला

कोई ऐसा संस्करण नहीं मिला जो आवश्यकता को पूरा करता हो

मैं क्या गलत कर रहा हूं?


ध्यान दें कि setup.py और pip पूरी तरह से अलग सिस्टम हैं। एक मुद्दा जो मेरे पास था वह यह था कि मैं इसे पाइप के लिए काम करने में सक्षम था, लेकिन सेटअपहोम के लिए नहीं।
बीसीएलटी

जवाबों:


51

आप इसे यहां करने का सही तरीका खोज सकते हैं ।

dependency_links=['http://github.com/user/repo/tarball/master#egg=package-1.0']

कुंजी एक गिट रिपॉजिटरी के लिए एक लिंक देने के लिए नहीं है, लेकिन टारबॉल के लिए एक लिंक है। यदि आप /tarball/masterऊपर दिखाए गए अनुसार GitHub आपके लिए मास्टर शाखा का एक टारबॉल बनाता है ।


17
इस विधि की तरह दिखता प्रति अनुचित बताया गया है github.com/pypa/pip/issues/3939
muon

3
यह विधि निजी रिपॉजिटरी के लिए भी बेकार है, क्योंकि प्रमाणित करने का कोई तरीका नहीं है।
tedivm

3
मैंने इसे काम करने के लिए प्रबंधित किया और एक और उत्तर जोड़ा है।
टेडिवम

1
/tarball/masterविधि gitlab के लिए काम नहीं करता है
मार्टिन थोमा

5
पदावनत। सही उत्तर Pep508 का उपयोग करना है, जिसका उत्तर नीचे दिए गए @ फॉक्स द्वारा दिया गया है
SwimBikeRun

117

उपरोक्त टिप्पणियों और PEP-508 विनिर्देश में @muon द्वारा जुड़े पाइप मुद्दे के माध्यम से खुदाई 3939 के बाद खुदाई करने के बाद , मुझे इस विनिर्देश पैटर्न (और नहीं ) का उपयोग करके स्थापित करने के लिए अपने निजी रेपो निर्भरता प्राप्त करने में सफलता मिली :setup.pyinstall_requiresdependency_links

install_requires = [
  'some-pkg @ git+ssh://git@github.com/someorgname/pkg-repo-name@v1.1#egg=some-pkg',
]

@v1.1GitHub पर बनाया रिहाई टैग इंगित करता है और एक शाखा, प्रतिबद्ध, या टैग के विभिन्न प्रकार के साथ प्रतिस्थापित किया जा सकता है।


नोट: यह स्थानीय / निजी पैकेजों के लिए ठीक काम करता है, हालाँकि, आप PyPI को एक पैकेज जारी नहीं कर सकते हैं जो इस सिंटैक्स का उपयोग इसके सेटअप-थ्रू में करता है
ब्रायन

7
@ ब्रायन क्या आप आधिकारिक बयान का लिंक प्रदान कर सकते हैं?
हाथी

12
git+https://github.comयदि आप SSH का उपयोग नहीं करना चाहते हैं तो नोट कर सकते हैं ।
मल्टीथ्रैट 3 डी 3

2
इसलिए - अपग्रेड करने के लिए सही तरीका क्या है? भले ही मैं एक टैग संस्करण निर्दिष्ट करता हूं एक उन्नयन नए टैग संस्करणों की उपेक्षा करता है
पियासेंटी

1
@ एलिफेंट सुपर अधिकारी नहीं हैं, लेकिन ये कम से कम PyPA के वास्तविक सदस्यों से पाइप गिटहब परियोजना पर टिप्पणी कर रहे हैं: github.com/pypa/pip/issues/4187#issuecomment-415680805 और आगे की व्याख्या: github.com/pypa/pip / इश्यू / 4187 # जारीकरण -415067034
डोमिनिक

21

निम्नलिखित उत्तर पिप 19+ के लिए दर्शाया गया है


दुर्भाग्य से अन्य उत्तर निजी रिपोजिटरी के साथ काम नहीं करते हैं, जो इसके लिए सबसे आम उपयोग मामलों में से एक है। मैंने आखिरकार इसे एक ऐसी setup.pyफ़ाइल के साथ काम कर लिया जो इस तरह दिखती है:

from setuptools import setup, find_packages

setup(
    name = 'MyProject',
    version = '0.1.0',
    url = '',
    description = '',
    packages = find_packages(),
    install_requires = [
        # Github Private Repository - needs entry in `dependency_links`
        'ExampleRepo'
    ],

    dependency_links=[
        # Make sure to include the `#egg` portion so the `install_requires` recognizes the package
        'git+ssh://git@github.com/example_organization/ExampleRepo.git#egg=ExampleRepo-0.1'
    ]
)

"निर्भरता_लिंक" का उपयोग करने की आवश्यकता को हटाकर पाइप के नए संस्करण इसे और भी आसान बनाते हैं -

from setuptools import setup, find_packages

setup(
    name = 'MyProject',
    version = '0.1.0',
    url = '',
    description = '',
    packages = find_packages(),
    install_requires = [
        # Github Private Repository
        'ExampleRepo @ git+ssh://git@github.com/example_organization/ExampleRepo.git#egg=ExampleRepo-0.1'
    ]
)

1
क्या आप विस्तृत कर सकते हैं कि -0.1आपके दृष्टिकोण में क्या है? क्या आप संस्करण संख्या को एक रिलीज़ से या setup.pyविवरण से लेते हैं ?
Peteris

2
Setup.py फ़ाइल से- यदि आप किसी विशिष्ट शाखा का उपयोग करना चाहते हैं या टैग करते हैं तो आप चीजों को थोड़ा अलग तरीके से प्रारूपित करते हैं।
टेडिवम

"दुर्भाग्य से अन्य उत्तर निजी रिपोजिटरी के साथ काम नहीं करते हैं" यह अब सच नहीं है फॉक्स का जवाब बिना ज़रूरत के निजी रेपो पर काम करता है dependency_links(जो पदावनत है )
केटो

धन्यवाद @ केतो! मुझे नहीं पता कि आपके संपादन को अस्वीकार क्यों किया गया, लेकिन मोड, लेकिन मैं आगे बढ़ गया और उस अस्वीकृति को जवाब में जोड़ने के लिए अस्वीकृति को ओवररोड कर दिया।
tedivm

3

एक अधिक सामान्य जवाब: आवश्यकताओं से जानकारी प्राप्त करने के लिए। मैं क्या करूँ फ़ाइल:

from setuptools import setup, find_packages
from os import path

loc = path.abspath(path.dirname(__file__))

with open(loc + '/requirements.txt') as f:
    requirements = f.read().splitlines()

required = []
dependency_links = []

# Do not add to required lines pointing to Git repositories
EGG_MARK = '#egg='
for line in requirements:
    if line.startswith('-e git:') or line.startswith('-e git+') or \
            line.startswith('git:') or line.startswith('git+'):
        if EGG_MARK in line:
            package_name = line[line.find(EGG_MARK) + len(EGG_MARK):]
            required.append(package_name)
            dependency_links.append(line)
        else:
            print('Dependency to a git repository should have the format:')
            print('git+ssh://git@github.com/xxxxx/xxxxxx#egg=package_name')
    else:
        required.append(line)

setup(
    name='myproject',  # Required
    version='0.0.1',  # Required
    description='Description here....',  # Required
    packages=find_packages(),  # Required
    install_requires=required,
    dependency_links=dependency_links,
)

1

वास्तव में यदि आप अपने पैकेज को आवर्ती रूप से स्थापित करना चाहते हैं (YourCurrentPackage में आपका SomePirtLib शामिल है), उदाहरण के लिए, जब आप YourCurrentPackage को एक दूसरे में सम्मिलित करना चाहते हैं (जैसे OuterPackage → YourCurrentPackage → SomePStreetLib) आपको दोनों की आवश्यकता होगी:

install_requires=[
    ...,
    "SomePrivateLib @ git+ssh://github.abc.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
],
dependency_links = [
    "git+ssh://github.abc.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
]

और सुनिश्चित करें कि आपके पास अपने संस्करण संख्या के साथ एक टैग बना है।

इसके अलावा अगर आपका Git प्रोजेक्ट निजी है और आप इसे कंटेनर के अंदर स्थापित करना पसंद करते हैं, जैसे, Docker या GitLab रनर, तो आपको अपनी रिपॉजिटरी में अधिकृत एक्सेस की आवश्यकता होगी। कृपया पहुंच टोकन के साथ Git + HTTPS का उपयोग करने पर विचार करें (जैसे GitLab पर: https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html ):

import os
from setuptools import setup

TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    ....

    install_requires=[
            ...,
            f"SomePrivateLib @ git+https://gitlab-ci-token:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ],
    dependency_links = [
            f"git+https://gitlab-ci-token:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

0

मैं GitLab में इन तीन विकल्पों के साथ सफल रहा । मैं GitLab के संस्करण 11 का उपयोग कर रहा हूं।

विकल्प 1 - कोई टोकन निर्दिष्ट नहीं है। शेल उपयोगकर्ता नाम / पासवर्ड के लिए संकेत देगा।

from setuptools import setup

TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    install_requires=[
        "SomePrivateLib @ git+https://gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

विकल्प 2 - उपयोगकर्ता पहुंच निर्दिष्ट टोकन। GitLab → अकाउंट टॉप राइट → सेटिंग → एक्सेस टोकन पर जाकर टोकन जेनरेट होता है। Read_repository अधिकारों के साथ टोकन बनाएं।

उदाहरण:

import os
from setuptools import setup

TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    install_requires=[
        f"SomePrivateLib @ git+https://gitlab-ci-token:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

विकल्प 3 - रिपॉजिटरी-स्तर टोकन निर्दिष्ट। टोकन रिपॉजिटरी → सेटिंग → रिपॉजिटरी → परिनियोजन टोकन पर जाकर उत्पन्न होता है। यहां से, read_repository अधिकारों के साथ एक टोकन बनाएं।

उदाहरण:

import os
from setuptools import setup

TOKEN_USER = os.getenv('EXPORTED_TOKEN_USER')
TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    install_requires=[
        f"SomePrivateLib @ git+https://{TOKEN_USER}:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

इन तीनों में, मैं अंत में #egg अंकन के बिना: "SomePStreetLib @ git + https: //gitlab.server.com/abc/SomePStreetLib.git" करने में सक्षम था।

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