Python setuptools: hoe kan ik een privé repository vermelden onder install_requires?

Ik maak een setup.py-bestand voor een project dat afhankelijk is van privé GitHub-opslagplaatsen. De relevante delen van het bestand zien er als volgt uit:

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/',
    ],
    ...,
)

Ik gebruik setuptoolsin plaats van distutilsomdat de laatste de argumenten install_requiresen dependency_linksniet ondersteunt ditantwoord.

Het bovenstaande installatiebestand heeft geen toegang tot de privé-opslagplaatsen met een 404-fout – wat te verwachten is omdat GitHub een 404 retourneert naar ongeautoriseerde verzoeken om een ​​privé-opslagplaats. Ik kan er echter niet achter komen hoe ik setuptoolskan laten authenticeren.

Hier zijn enkele dingen die ik heb geprobeerd:

  1. Gebruik git+ssh://in plaats van https://in dependency_linkszoals ik zou doen als ik de repo zou installeren met pip. Dit mislukt omdat setuptools dit protocol niet herkent (“onbekend url-type: git+ssh”), hoewel de documentatie verspreidenzegt dat het zou moeten. Idem git+httpsen git+http.

  2. https://<username>:<password>@github.com/...– krijg nog steeds een 404. (Deze methode werkt niet met curlof wgetvanaf de opdrachtregel – hoewel curl -u <username> <repo_url> -O <output_file_name>wel werkt.)

  3. Upgrade setuptools (0.9.7) en virtualenv (1.10) naar de nieuwste versies. Ook geprobeerd Distribut te installeren, hoewel dit overzichtzegt dat het weer is samengevoegd met setuptools . Hoe dan ook, geen dobbelstenen.

Momenteel laat ik setup.pyeen waarschuwing afdrukken dat de privérepo’s apart moeten worden gedownload. Dit is duidelijk minder dan ideaal. Ik heb het gevoel dat er iets duidelijks is dat ik mis, maar ik kan niet bedenken wat het zou kunnen zijn. 🙂

Dubbele vraag zonder antwoorden hier.


Antwoord 1, autoriteit 100%

Ik probeerde dit te laten werken voor installatie met pip, maar het bovenstaande werkte niet voor mij. Uit [1] begreep ik dat de PEP508-standaard moest worden gebruikt, uit [2] haalde ik een voorbeeld op dat echt werkt (althans voor mijn geval).

Let op; dit is met pip 20.0.2op Python 3.7.4

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

Nadat ik mijn pakket op deze manier heb gespecificeerd, werkt de installatie prima (ook met -einstellingen en zonder de noodzaak om --process-dependency-linksop te geven).

Referenties
[1] https://github.com/pypa/pip/issues/4187
[2] https://github.com/pypa/pip/issues/5566


Antwoord 2, autoriteit 48%

Dit is wat voor mij werkte:

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

Houd er rekening mee dat je het versienummer in de naam van het ei moet hebben, anders zal het zeggen dat het het pakket niet kan vinden.


Antwoord 3, autoriteit 12%

Ik kon hier geen goede documentatie over vinden, maar kwam de oplossing voornamelijk tegen via proef- & fout. Verder installeren vanaf pip & setuptools hebben enkele subtiele verschillen; maar deze manier zou voor beide moeten werken.

GitHub biedt (momenteel, vanaf augustus 2016) geen gemakkelijke manier om de zip / tarball van privérepo’s te krijgen. Dus je moet setuptools aanwijzen om setuptools te vertellen dat je naar een git repo verwijst:

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

Hier een paar opmerkingen:

  • Voor privérepo’s moet je je authenticeren met GitHub; de eenvoudigste manier die ik heb gevonden, is door een oauth-token te maken, dat in uw omgeving te plaatsen en het vervolgens op te nemen in de URL
  • Je moet eenversienummer (hier is 0) aan het einde van de link toevoegen, zelfs als er geen pakket op PyPI staat. Dit moet een echt getal zijn, geen woord.
  • Je moet git+inleiden om setuptools te vertellen dat het de repo moet klonen, in plaats van naar een zip / tarball te wijzen
  • versionkan een branch, een tag of een commit-hash zijn
  • U moet --process-dependency-linksopgeven als u vanaf pip installeert

Antwoord 4, autoriteit 4%

Ik heb een (hacky) oplossing gevonden:

#!/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'] )

Ik begrijp dat er ethische problemen zijn met het hebben van een systeemaanroep in een installatiescript, maar ik kan geen andere manier bedenken om dit te doen.


Antwoord 5, autoriteit 3%

Via het antwoord van Tom Hemmes ontdekte ik dat dit het enige was dat voor mij werkte:

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

Antwoord 6

Het gebruik van de archief-URL van github werkt voor mij, voor openbare opslagplaatsen. Bijv.

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

Antwoord 7

Met pip 20.1.1 werkt dit voor mij

install_requires=[ "packson3@https://tracinsy.ewi.tudelft.nl/pubtrac/Utilities/export/138/packson3/dist/packson3-1.0.0.tar.gz"],

in setup.py


Antwoord 8

Bewerken: dit lijkt alleen te werken met openbare github-repositories, zie opmerkingen.

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',
],

Bovenstaande syntaxis lijkt voor mij te werken met setuptools 1.0. Op dit moment is in ieder geval de syntaxis van het toevoegen van “#egg=project_name-version” aan VCS-afhankelijkheden gedocumenteerd in de link die u gaf aan documentatie verspreiden.


Antwoord 9

Dit werkt voor ons scenario:

  1. pakket staat op github in een privé repo
  2. we willen het in site-packages installeren (niet in ./src met -e)
  3. pip install -r requirements.txt kunnen gebruiken
  4. pip install -e reposdir (of van github) kunnen gebruiken, waarbij de afhankelijkheden alleen worden gespecificeerd in requirements.txt

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

Other episodes