Ich erstelle eine setup.py
Datei für ein Projekt, das von privaten GitHub-Repositorys abhängt. Die relevanten Teile der Datei sehen folgendermaßen aus:
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/',
],
...,
)
Ich verwende setuptools
anstelle von, distutils
weil letzteres die install_requires
und dependency_links
Argumente gemäß dieser Antwort nicht unterstützt .
Die obige Setup-Datei greift nicht mit einem 404-Fehler auf die privaten Repos zu - was zu erwarten ist, da GitHub einen 404 an nicht autorisierte Anforderungen für ein privates Repository zurückgibt. Ich kann jedoch nicht herausfinden, wie ich mich setuptools
authentifizieren soll.
Hier sind einige Dinge, die ich versucht habe:
Verwenden Sie
git+ssh://
statthttps://
independency_links
wie bei der Installation des Repos mitpip
. Dies schlägt fehl, weil setuptools dieses Protokoll nicht erkennt ("unbekannter URL-Typ: git + ssh"), obwohl die Distributionsdokumentation dies vorschreibt . Dittogit+https
undgit+http
.https://<username>:<password>@github.com/...
- Erhalte immer noch eine 404. (Diese Methode funktioniert auch nicht mitcurl
oderwget
über die Befehlszeile - obwohlcurl -u <username> <repo_url> -O <output_file_name>
sie funktioniert.)Aktualisieren von setuptools (0.9.7) und virtualenv (1.10) auf die neuesten Versionen. Ich habe auch versucht, Distribute zu installieren, obwohl diese Übersicht besagt, dass es wieder in Setuptools zusammengeführt wurde. So oder so, keine Würfel.
Derzeit habe ich nur setup.py
eine Warnung ausgedruckt, dass die privaten Repos separat heruntergeladen werden müssen. Dies ist offensichtlich nicht ideal. Ich habe das Gefühl, dass etwas Offensichtliches fehlt, kann mir aber nicht vorstellen, was es sein könnte. :) :)
Doppelte Frage ohne Antworten hier .
quelle
Antworten:
Ich habe versucht, dies für die Installation mit pip zum Laufen zu bringen, aber das oben Genannte hat bei mir nicht funktioniert. Aus [1] habe ich verstanden, dass der
PEP508
Standard verwendet werden sollte, aus [2] habe ich ein Beispiel abgerufen, das tatsächlich funktioniert (zumindest für meinen Fall).Bitte beachten Sie; das ist mit
pip 20.0.2
aufPython 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>', ], )
Nachdem Sie mein Paket auf diese Weise angegeben haben, funktioniert die Installation einwandfrei (auch mit
-e
Einstellungen und ohne Angabe--process-dependency-links
).Referenzen [1] https://github.com/pypa/pip/issues/4187 [2] https://github.com/pypa/pip/issues/5566
quelle
#egg=...
Teil scheint jetzt unnötig.#egg
undbranch
sind optional (siehe Bearbeiten) und es funktioniert auch fürgit+https
.ssh://
in und führenCould not resolve hostname
Änderung der:
zu/
Ihrer Klon URL. Ich hatte diesen Fehler mit Gitlab.Reading https://pypi.org/simple/some-fake-name/
und dannCouldn't find index page for 'some_fake_name' (maybe misspelled?)
. Am Ende ist der letzte angezeigte Fehlererror: Could not find suitable distribution for Requirement.parse('some_fake_name@ git+ssh://[email protected]/cglacet/quadtree.git')
Folgendes hat bei mir funktioniert:
install_requires=[ 'private_package_name==1.1', ], dependency_links=[ 'git+ssh://[email protected]/username/private_repo.git#egg=private_package_name-1.1', ]
Beachten Sie, dass Sie die Versionsnummer im Eiernamen haben müssen, da sonst das Paket nicht gefunden werden kann.
quelle
pip install --process-dependency-links ...
--process-dpendency-links
ist veraltet, siehe meine Antwort mit PEP508 URL-SpezifikationIch konnte keine gute Dokumentation dazu finden, bin aber hauptsächlich durch Ausprobieren auf die Lösung gestoßen. Darüber hinaus weist die Installation von pip & setuptools einige subtile Unterschiede auf. aber dieser Weg sollte für beide funktionieren.
GitHub bietet (derzeit ab August 2016) keine einfache Möglichkeit, den Zip / Tarball von privaten Repos zu erhalten. Sie müssen also auf setuptools zeigen, um setuptools mitzuteilen, dass Sie auf ein Git-Repo zeigen:
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) ]
Ein paar Anmerkungen hier:
0
) einfügen, auch wenn auf PyPI kein Paket vorhanden ist. Dies muss eine tatsächliche Zahl sein, kein Wort.git+
, um setuptools mitzuteilen, dass das Repo geklont werden soll, anstatt auf einen Reißverschluss / Tarball zu zeigenversion
kann ein Zweig, ein Tag oder ein Commit-Hash sein--process-dependency-links
wenn Sie von Pip installierenquelle
v
Github vorangestellt. Also musste ichv1.1.0
statt1.1.0
in meinem setup.py-Skript verwenden.Ich habe eine (hackige) Problemumgehung gefunden:
#!/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'] )
Ich verstehe, dass es ethische Probleme mit einem Systemaufruf in einem Setup-Skript gibt, aber ich kann mir keinen anderen Weg vorstellen, dies zu tun.
quelle
import pip
. Weder die Antwort von @ vadimg noch dieser Vorschlag in pypa / pip funktionierten.python setup.py --version
.Über die Antwort von Tom Hemmes stellte ich fest, dass dies das einzige ist, was für mich funktioniert hat:
install_requires=[ '<package> @ https://github.com/<username>/<package>/archive/<branch_name>.zip']
quelle
Die Verwendung der Archiv-URL von github funktioniert für mich in öffentlichen Repositorys. Z.B
dependency_links = [ 'https://github.com/username/reponame/archive/master.zip#egg=eggname-version', ]
quelle
eggname-version
?Bearbeiten: Dies scheint nur mit öffentlichen Github-Repositorys zu funktionieren, siehe Kommentare.
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', ],
Die obige Syntax scheint für mich mit setuptools 1.0 zu funktionieren. Derzeit ist zumindest die Syntax zum Hinzufügen von "#gg = project_name-version" zu VCS-Abhängigkeiten in dem Link dokumentiert, den Sie zum Verteilen der Dokumentation angegeben haben .
quelle
Diese Arbeit für unser Szenario:
https://github.com/pypa/pip/issues/3610#issuecomment-356687173
quelle