Tworzę setup.py
plik dla projektu, który zależy od prywatnych repozytoriów GitHub. Odpowiednie części pliku wyglądają następująco:
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/',
],
...,
)
Używam setuptools
zamiast, distutils
ponieważ ten ostatni nie obsługuje argumentów install_requires
i dependency_links
na tę odpowiedź.
Powyższy plik instalacyjny nie uzyskuje dostępu do prywatnych repozytoriów z błędem 404 - czego należy się spodziewać, ponieważ GitHub zwraca 404 do nieautoryzowanych żądań prywatnego repozytorium. Jednak nie mogę dowiedzieć się, jak dokonać setuptools
uwierzytelnienia.
Oto kilka rzeczy, które wypróbowałem:
Użyj
git+ssh://
zamiasthttps://
in,dependency_links
tak jak w przypadku instalowania repozytorium zpip
. Nie udaje się to, ponieważ setuptools nie rozpoznaje tego protokołu („nieznany typ adresu URL: git + ssh”), chociaż dokumentacja dystrybucji mówi, że powinien. Jak wyżejgit+https
igit+http
.https://<username>:<password>@github.com/...
- jeszcze dostać 404. (ta metoda nie działa zcurl
lubwget
z linii poleceń albo - choćcurl -u <username> <repo_url> -O <output_file_name>
nie działa).Aktualizacja setuptools (0.9.7) i virtualenv (1.10) do najnowszych wersji. Próbowałem również zainstalować dystrybucję, chociaż w tym przeglądzie stwierdzono, że została ona ponownie scalona z narzędziami instalacyjnymi. Tak czy inaczej, bez kości.
Obecnie właśnie setup.py
wydrukowałem ostrzeżenie, że prywatne repozytoria należy pobrać osobno. To jest oczywiście mniej niż idealne. Czuję, że jest coś oczywistego, czego mi brakuje, ale nie mogę pomyśleć, co to może być. :)
Zduplikowane pytanie bez odpowiedzi tutaj .
źródło
Odpowiedzi:
Próbowałem zmusić to do zainstalowania za pomocą pip, ale powyższe nie działało dla mnie. Z [1] zrozumiałem, że
PEP508
należy zastosować standard, z [2] wyszukałem przykład, który faktycznie działa (przynajmniej w moim przypadku).Proszę zanotować; to jest
pip 20.0.2
włączonePython 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>', ], )
Po określeniu mojego pakietu w ten sposób instalacja działa dobrze (również z
-e
ustawieniami i bez potrzeby określania--process-dependency-links
).Źródła [1] https://github.com/pypa/pip/issues/4187 [2] https://github.com/pypa/pip/issues/5566
źródło
#egg=...
część wydaje się teraz niepotrzebna.#egg
i drugiebranch
jest opcjonalne (patrz edycja) i działa również w przypadkugit+https
.ssh://
i napotkaszCould not resolve hostname
zmieniana jest:
, aby/
w swoim klonie URL. Miałem ten błąd w gitlab.Reading https://pypi.org/simple/some-fake-name/
a następnieCouldn't find index page for 'some_fake_name' (maybe misspelled?)
. Ostatecznie ostatni wyświetlany błąd toerror: Could not find suitable distribution for Requirement.parse('some_fake_name@ git+ssh://[email protected]/cglacet/quadtree.git')
Oto, co zadziałało dla mnie:
install_requires=[ 'private_package_name==1.1', ], dependency_links=[ 'git+ssh://[email protected]/username/private_repo.git#egg=private_package_name-1.1', ]
Zauważ, że musisz mieć numer wersji w nazwie jajka, w przeciwnym razie powie, że nie może znaleźć pakietu.
źródło
pip install --process-dependency-links ...
--process-dpendency-links
jest przestarzały, zobacz moją odpowiedź przy użyciu specyfikacji adresu URL PEP508Nie mogłem znaleźć żadnej dobrej dokumentacji na ten temat, ale natknąłem się na rozwiązanie głównie metodą prób i błędów. Co więcej, instalacja z pip & setuptools ma pewne subtelne różnice; ale ten sposób powinien działać dla obu.
GitHub nie oferuje (obecnie, stan na sierpień 2016 r.) Łatwego sposobu na pobranie archiwum ZIP / tarball z prywatnych repozytoriów. Musisz więc wskazać setuptools, aby poinformować setuptools, że wskazujesz repozytorium git:
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) ]
Kilka uwag:
0
) na końcu łącza, nawet jeśli nie ma pakiet na PyPI. To musi być rzeczywista liczba, a nie słowo.git+
poprzedzić słowo, aby powiedzieć setuptools, że ma sklonować repozytorium zamiast wskazywać na plik zip / tarballversion
może być gałęzią, znacznikiem lub hashem zatwierdzenia--process-dependency-links
jeśli instalujesz z pipźródło
v
przedrostek na githubie. Więc musiałem użyćv1.1.0
zamiast1.1.0
w moim skrypcie setup.py.Znalazłem (hacky) obejście:
#!/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'] )
Rozumiem, że istnieją problemy etyczne z wywołaniem systemowym w skrypcie konfiguracyjnym, ale nie mogę wymyślić innego sposobu, aby to zrobić.
źródło
import pip
. Ani odpowiedź @ vadimg, ani ta sugestia w pypa / pip nie zadziałały.python setup.py --version
.Dzięki odpowiedzi Toma Hemmesa stwierdziłem, że jest to jedyna rzecz, która działa dla mnie:
install_requires=[ '<package> @ https://github.com/<username>/<package>/archive/<branch_name>.zip']
źródło
Użycie adresu URL archiwum z github działa dla mnie w przypadku repozytoriów publicznych. Na przykład
dependency_links = [ 'https://github.com/username/reponame/archive/master.zip#egg=eggname-version', ]
źródło
eggname-version
?Edycja: wydaje się, że działa tylko z publicznymi repozytoriami github, zobacz komentarze.
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', ],
Powyższa składnia wydaje mi się działać z setuptools 1.0. W tej chwili przynajmniej składnia dodawania "# egg = nazwa_projektu-wersja" do zależności VCS jest udokumentowana w linku, który podałeś do dystrybucji dokumentacji .
źródło
Ta praca dla naszego scenariusza:
https://github.com/pypa/pip/issues/3610#issuecomment-356687173
źródło