Hoe setup.py te schrijven om een ​​Git-repository als afhankelijkheid op te nemen

Ik probeer setup.pyte schrijven voor mijn pakket. Mijn pakket moet een afhankelijkheid van een andere Git-repository specificeren.

Dit is wat ik tot nu toe heb:

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

Als ik hardloop:

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

Ik snap

Kon geen versie vinden die aan de vereiste voldoet
SomePrivateLib>=0.1.0 (van analyse) (van versies: ) Geen overeenkomst
distributie gevonden voor SomePrivateLib>=0.1.0 (uit analyse)

Wat doe ik verkeerd?


Antwoord 1, autoriteit 100%

Na het doorzoeken van de pip issue 3939die door @muon in de opmerkingen hierboven is gelinkt en toen de PEP-508-specificatie, vond ik succes om mijn private repo-afhankelijkheid te krijgen installeer via setup.pymet dit specificatiepatroon in install_requires(geen dependency_linksmeer):

install_requires = [
  'some-pkg @ git+ssh://[email protected]/someorgname/[email protected]#egg=some-pkg',
]

De @v1.1geeft de release-tag aan die op github is gemaakt en kan worden vervangen door een branch, commit of een ander type tag.


Antwoord 2, autoriteit 30%

Opmerking:dit antwoord is nu verouderd. Bekijk dit antwoord hieronder van @Dick Fox voor actuele instructies: https://stackoverflow.com/a/54794506 /2272172


Je kunt de juiste manier vinden om dit te doen hier.

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

De sleutel is niet om een ​​link naar een Git-repository te geven, maar een link naar een tarball. GitHub maakt een tarball van de master branch voor je als je /tarball/mastertoevoegt zoals hierboven getoond.


Antwoord 3, autoriteit 26%

Dit antwoord is regelmatig bijgewerkt omdat Python in de loop der jaren is geëvolueerd. Scroll naar beneden voor het meest actuele antwoord, of lees verder om te zien hoe dit is geëvolueerd.

Helaas werkt het andere antwoord niet met privé-opslagplaatsen, wat hiervoor een van de meest voorkomende gebruiksgevallen is. Ik heb het uiteindelijk werkend gekregen met een setup.py-bestand dat er als volgt uitziet (nu verouderde) methode:

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://[email protected]/example_org/ExampleRepo.git#egg=ExampleRepo-0.1'
    ]
)

Nieuwere versies van pip maken dit nog gemakkelijker door de noodzaak om “dependency_links” te gebruiken te elimineren-

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://[email protected]/example_org/ExampleRepo.git#egg=ExampleRepo-0.1'
    ]
)

Met de allernieuwste pip loop je echter tegen problemen aan met de EGG-formaathandler. Dit komt omdat terwijl het ei wordt genegeerd, pip nu directe URL-matching uitvoert en twee URL’s, één met het ei-fragment en de andere zonder, als volledig verschillende versies beschouwt, zelfs als ze naar hetzelfde pakket verwijzen. Daarom is het het beste om eventuele eierfragmenten weg te laten.

Dus de beste manier (vanaf juni 2021) om een ​​afhankelijkheid aan Github toe te voegen die werkt met openbare en privé-opslagplaatsen:

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://[email protected]/example_org/ExampleRepo.git'
    ]
)

Antwoord 4, autoriteit 4%

Een meer algemeen antwoord: om de informatie uit het bestand requirements.txtte halen, doe ik:

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+'):
        line = line.lstrip('-e ')  # in case that is using "-e"
        if EGG_MARK in line:
            package_name = line[line.find(EGG_MARK) + len(EGG_MARK):]
            repository = line[:line.find(EGG_MARK)]
            required.append('%s @ %s' % (package_name, repository))
            dependency_links.append(line)
        else:
            print('Dependency to a git repository should have the format:')
            print('git+ssh://[email protected]/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,
)

Antwoord 5

Ik was succesvol met deze drie opties in GitLab. Ik gebruik versie 11 van GitLab.

Optie 1 – geen token opgegeven. De shell vraagt ​​om gebruikersnaam/wachtwoord.

from setuptools import setup
TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')
setup(
    install_requires=[
        "SomePrivateLib @ git+https://gitlab.server.com/abc/[email protected]#egg=SomePrivateLib"
    ]
)

Optie 2 – gebruikerstoegangstoken opgegeven. Het token gegenereerd door naar GitLab → account rechtsboven → instellingen → toegangstokens te gaan. Maak het token met read_repository-rechten.

Voorbeeld:

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/[email protected]#egg=SomePrivateLib"
    ]
)

Optie 3 – token op opslagplaatsniveau opgegeven. Het token dat wordt gegenereerd door naar de repository → instellingen → repository → tokens in te zetten te gaan. Maak vanaf hier een token met read_repository-rechten.

Voorbeeld:

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/[email protected]#egg=SomePrivateLib"
    ]
)

In alle drie kon ik eenvoudig doen: “SomePrivateLib @ git+https://gitlab.server.com/abc/SomePrivateLib.git” zonder de #egg-markering aan het einde.

Other episodes