Căutam un server privat PyPi Python Package găzduit, care să folosească acreditările pe care echipa le are deja (cum ar fi GitHub).

Nu am vrut să creez un server local. Pentru noi, ar face imposibilă utilizarea serverelor de construcție bazate pe cloud și este o altă parte în mișcare care poate merge prost. Există, de asemenea, probleme potențiale cu securitate și viteză fine. (Avem o echipă mondială, astfel încât să servim conținutul prin intermediul unui CDN ar fi de ajutor.)

Nu am vrut să forțez echipa să creeze conturi cu un alt furnizor. Au deja conturi Active Directory și GitHub. Este o enervare pentru ei și îmi creează o povară de guvernare.

Din păcate, nu am putut găsi un astfel de serviciu. GemFury este excelent, dar nu acceptă autorizarea GitHub (la nivel de echipă / organizație) și Packagr nu acceptă deloc autorizarea GitHub. MyGet este, de asemenea, excelent, îmi permite să folosesc autorizația GitHub, dar nu găzduiește pachete Python. Azure DevOps are ceva care pare promițător, dar este în beta privat pentru moment.

Din fericire, acest lucru este posibil folosind depozite Git cloud, cum ar fi GitHub, GitLab și BitBucket.

Pip poate instala pachete de la Git

Am găzduit un pachet Python pe GitHub (python_world), pe care îl puteți instala cu următoarea comandă (asigurați-vă că aveți încredere în mine înainte de a rula această comandă și de a instala codul meu pe computer).

pip install git+https://github.com/ceddlyburge/python_world#egg=python_world

Pip oferă opțiuni de instalare din cap, dintr-o ramură, dintr-o etichetă sau dintr-un commit. De obicei etichetez fiecare versiune și instalez din aceste etichete. A se vedea documentație de instalare pip pentru detalii complete.

Acest depozit este public, dar funcționează la fel cu un depozit privat, atâta timp cât aveți permisiunea. Nu există magie specială (este un pachet Python vanilat) și Setup.py face cea mai mare parte a muncii în mod normal.

Dacă sunteți nou în crearea pachetelor Python, Tutorial de ambalare a proiectelor Python merită citit rapid.

Setuptools poate instala, de asemenea, dependențe din Git

Setuptools este modul în care majoritatea oamenilor creează pachete Python.

Am găzduit un alt pachet pe GitHub python_hello, care depinde de python_world. (Sunt sigur că puteți vedea unde se îndreaptă acest lucru.)

Biții relevanți din setup.py sunt mai jos. install_requires precizează că python_world este o dependență necesară și îi spune Setuptools unde să o găsească.

install_requires=[
	'python_world@git+https://github.com/ceddlyburge/python_world#egg=python_world-0.0.1',
]

Puteți instala acest pachet folosind comanda de mai jos. De asemenea, va descărca dependenta python_world pachet.

pip install git+https://github.com/ceddlyburge/python_hello#egg=python_hello

Aceasta se leagă de o versiune specifică a python_world, ceea ce este păcat deoarece înseamnă că pip nu poate gestiona dependența (cum ar fi elaborarea unei versiuni acceptabile dacă mai multe lucruri se bazează pe ea). Cu toate acestea, până la sfârșitul acestui articol, vom fi eliminat necesitatea linkului specific.

Medii Python

După cum știe toată lumea care a folosit Python fără mediu, mediile economisesc multă frustrare și timp pierdut. Deci, trebuie să le sprijinim.

Am creat o repo (folosi-salut-lume) care definește python_hello ca dependență în requirements.txt pentru Virtualenv, și mediu.yml pentru Conda.

Dacă descărcați repo, puteți instala dependențele într-un virtualenv cu următoarea comandă.

pip install -r requirements.txt

Dacă utilizați conda, puteți utiliza această comandă:

conda env create -n use-hello-world

Indexul PyPi

Până acum putem instala pachete din depozitele noastre private Git. Aceste pachete pot, la rândul lor, defini dependențe de alte depozite private. Încă nu există un server PyPi la vedere.

Ne-am putea opri în acest moment. Cu toate acestea, sintaxa pentru definirea dependențelor este puțin misterioasă. Ar fi dificil pentru echipă să descopere ce pachete sunt disponibile și ne conectăm la versiuni specifice de pachete dependente, în loc să lăsăm pip să-l gestioneze.

Pentru a remedia acest lucru, putem configura un index PyPi care este conform cu Pep 503. Această specificație este destul de simplă și tocmai am creat indexul manual. Dacă acest lucru devine prea greoi, îl pot genera din API-ul GitHub.

Am creat asta Indexul PyPi folosind Pagini GitHub. Există lucruri echivalente pentru GitLab și BitBucket. Puteți vedea că cod sursa este foarte simplu. Site-urile GitHub Pages sunt întotdeauna publice (și probabil că nu există informații sensibile în indexul dvs.). Cu toate acestea, dacă aveți nevoie ca acestea să fie private, puteți utiliza un serviciu precum PrivateHub.

Un lucru de care trebuie să fii atent este normalizarea numelui din caietul de sarcini. Acest lucru necesită python_hello informații despre pachete care să fie prezente la python-hello/index.html (rețineți schimbarea de la un subliniat la o liniuță).

Acum că avem un server PyPi, putem instala pachete folosind comanda de mai jos.

pip install python_hello --extra-index-url https://ceddlyburge.github.io/python-package-server/

Pentru a putea vedea lucrul cu mediile, am creat o altă repo (use_hello_world_from_server) care definește python_hello dependență folosind acest index PyPi în loc de link-uri GitHub directe. Dacă îl încercați cu Conda, este necesară versiunea> 4.4.

În acest moment, putem să ne întoarcem și să eliminăm linkul direct Git install_requires în setup.py din python_hello (deoarece Setuptools îl va putea găsi de pe serverul nostru).

Concluzii

Utilizarea unui furnizor Git găzduit în cloud ca server PyPi este o opțiune viabilă. Dacă utilizați deja una, aceasta înseamnă că puteți reutiliza acreditările și permisiunile pe care le aveți deja. Acesta va funcționa cu servere Cloud Build și este probabil să fie furnizat printr-un CDN, deci va fi rapid la nivel mondial. Pentru a configura este nevoie de mai multe cunoștințe decât un server găzduit, dar probabil același sau mai puțin decât găzduirea propriului server în incintă.

Sugestii și sfaturi

Servirea indexului local poate ajuta la depanarea problemelor (cum ar fi normalizarea numelui). Este ușor să vedeți ce solicitări sunt făcute. Puteți utiliza serverul HTTP Python încorporat pentru aceasta (python -m Http.Server -8000). Acest lucru m-a determinat să aflu că pip search utilizări postsolicitări, deci nu va funcționa cu paginile GitHub.

Poți fugi python setup.py -install pentru a verifica local pachetele pip, înainte de a le împinge către Git.