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 setuptools
in plaats van distutils
omdat de laatste de argumenten install_requires
en dependency_links
niet 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 setuptools
kan laten authenticeren.
Hier zijn enkele dingen die ik heb geprobeerd:
-
Gebruik
git+ssh://
in plaats vanhttps://
independency_links
zoals ik zou doen als ik de repo zou installeren metpip
. Dit mislukt omdat setuptools dit protocol niet herkent (“onbekend url-type: git+ssh”), hoewel de documentatie verspreidenzegt dat het zou moeten. Idemgit+https
engit+http
. -
https://<username>:<password>@github.com/...
– krijg nog steeds een 404. (Deze methode werkt niet metcurl
ofwget
vanaf de opdrachtregel – hoewelcurl -u <username> <repo_url> -O <output_file_name>
wel werkt.) -
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.py
een 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.2
op 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 -e
instellingen en zonder de noodzaak om --process-dependency-links
op 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 version
kan een branch, een tag of een commit-hash zijn- U moet
--process-dependency-links
opgeven 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:
- pakket staat op github in een privé repo
- we willen het in site-packages installeren (niet in ./src met -e)
- pip install -r requirements.txt kunnen gebruiken
- 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