pip ignore les liens de dépendance dans setup.py

j'ai dependency_links dans mon setup.py:

...
dependency_links = ['http://github.com/robot-republic/python-s3/tarball/master.tar.gz#egg=python-s3'],
...

mais ça ne marche pas. Cependant install_requires fonctionne très bien. Peut-être qu'il y a une autre méthode pour mettre en place git repo comme requis pour setup.py Je ne sais pas.

46
demandé sur syabro 2012-09-20 22:17:42

3 réponses

Cette réponse devrait aider. En un mot, vous devez spécifier la version (ou "dev") pour le #egg=python-s3 donc il ressemble à #egg=python-s3-1.0.0 .

des Mises à jour sur @Cerin commentaire:

  • Pip 1.5.x a un drapeau pour activer le traitement des liens de dépendance: --process-dependency-links . Je ne l'ai pas testé parce que je suis d'accord avec le point ci-dessous.
  • Cette discussion semble indiquer que l'utilisation de liens de dépendance pour pip est une mauvaise pratique. Bien que cette fonctionnalité ait été utilisée pour déprécier, ce n'est plus le cas. Il y a un cas d'utilisation valide pour les paquets privés.
51
répondu Laur Ivan 2017-11-17 13:50:58

je sais, c'est une vieille question, mais, juste au cas où vous vous trouvez ici comme je l'ai fait, c'est ce qui a fonctionné pour moi.

j'ai un paquet sur GitHub (non enregistré avec pypi) qui s'appuie sur d'autres paquets GitHub (non-pypi). J'ai passé un temps fou à essayer de trouver comment pip pourrait gérer ça correctement. J'inclurai ce que j'ai fait pour le réparer ici.

Mettre les dépendances à l'une des exigences.fichier txt est le préféré méthode d'énumération des dépendances. Cependant, vous devez également remplir install_requires dans setup. C'est à ce moment que j'ai rencontré un obstacle avec pip ne voulant pas installer les dépendances de GitHub.

la plupart des endroits, y compris les réponses à cette question, vous disent de remplir la section dependency_links DE setup. cependant, vous devez aussi remplir le champ install_requires avec le nom du paquet référencé dans dependency_links.

Par exemple, si vos exigences.txt contient les éléments suivants.

somepackage==1.2.0
https://github.com/user/repo/tarball/master#egg=repo-1.0.0
anotherpackage==4.2.1

alors, votre appel d'installation devrait ressembler à ceci:

setup(
    name='yourpackage',
    version='1.7.5',
    packages=[],
    url='',
    license='',
    author='',
    author_email='',
    description='',
    install_requires=[
        'somepackage==1.2.0',
        'repo==1.0.0',
        'anotherpackage==4.2.1'
    ],
    dependency_links=[
        'https://github.com/user/repo/tarball/master#egg=repo-1.0.0'
    ]
)

Ok, donc maintenant nous avons notre paquet configuré; l'Installer est la tâche suivante. C'est là que j'ai passé beaucoup de temps. Je ne pouvais pas comprendre pourquoi le fait de spécifier dependency_links n'a apparemment rien fait. Le truc, c'est que, dans certains cas, vous devez définir le permettre-tout-externe (peut être plus spécifique) drapeau du pip. Par exemple:

pip install git+https://github.com/user/anotherrepo.git
--process-dependency-links --allow-all-external

C'est fini et ça marche!

clause de non-responsabilité: dependency_links et les options process-dependency-links et allow-all-external sont dépréciées, donc elles seront bientôt supprimées. Pendant le temps que j'ai passé, Je ne pouvais pas trouver une meilleure méthode, préferée et encore avoir fonction PIP correctement.

36
répondu Chad 2017-12-06 20:49:36

quelques notes sur quelques problèmes que j'ai trouvé, en particulier pour l'installation à partir de prises en pension privées.

installation à partir de pip & setuptools ont quelques différences subtiles, mais cette façon devrait fonctionner pour les deux.

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

quelques notes ici:

  • pour les repos privés, vous devez vous authentifier avec GitHub; le moyen le plus simple que j'ai trouvé est de créer un jeton oauth, le laisser tomber dans votre environnement, et puis inclure il avec L'URL
  • Vous devez inclure certains numéro de version (ici c'est 0 ) à la fin du lien, même si il n'y a pas de forfait sur PyPI. Ce doit être un nombre réel, pas un mot.
  • vous avez besoin de préface avec git+ pour dire setuptools il est de cloner le repo, plutôt que de pointer vers un zip / tarball
  • version peut être d'une succursale, d'une étiquette, ou une validation de hachage
  • vous devez fournir --process-dependency-links si vous installez à partir de pip
8
répondu Maximilian 2016-08-31 16:50:39