web-dev-qa-db-fra.com

Comment écrire setup.py pour inclure un dépôt git en tant que dépendance

J'essaie d'écrire setup.py pour mon package. Mon package doit spécifier une dépendance sur un autre dépôt git.

Voici ce que j'ai jusqu'à présent:

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

Quand je cours:

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

Je reçois

Impossible de trouver une version qui satisfait à l'exigence SomePrivateLib> = 0.1.0 (à partir de l'analyse) (à partir des versions:) Aucune distribution correspondante trouvée pour SomePrivateLib> = 0.1.0 (à partir de l'analyse)

Qu'est-ce que je fais mal ?

53
abc

Vous pouvez trouver la bonne façon de le faire ici .

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

La clé n'est pas de donner un lien vers un dépôt git, mais un lien vers un tarball. Github crée pour vous une archive tar de la branche master si vous ajoutez /tarball/master Comme montré ci-dessus.

36
cel

Après avoir fouillé dans le problème pip 3939 lié par @muon dans les commentaires ci-dessus, puis le spécification PEP-508 , j'ai réussi à obtenir l'installation de ma dépendance de dépôt privé via setup.py En utilisant ce modèle de spécification dans install_requires (Plus dependency_links):

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

Le @v1.1 Indique la balise de sortie créée sur github et pourrait être remplacée par une branche, une validation ou un autre type de balise.

30
Dick Fox

Malheureusement, l'autre réponse ne fonctionne pas avec les référentiels privés, ce qui est l'un des cas d'utilisation les plus courants pour cela. J'ai finalement réussi à le faire fonctionner avec un setup.py fichier qui ressemble à ceci:

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_organization/ExampleRepo.git#Egg=ExampleRepo-0.1'
    ]

)
7
tedivm

Une réponse plus générale, pour obtenir les informations du fichier requeriments.txt que je fais:

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://[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,
) 
1
Gonzalo Odiard