Kako koristiti GitHub kao PyPi poslužitelj

Tražio sam hostiranog privatnog poslužitelja PyPi Python Package koji je koristio vjerodajnice koje tim već ima (kao što je GitHub).

Nisam želio stvoriti lokalni poslužitelj. Za nas bi to onemogućilo upotrebu poslužitelja za izradu temeljenih na oblaku, a to je još jedan pokretni dio koji može poći po zlu. Postoje i potencijalni problemi s finoću i sigurnošću i brzinom. (Imamo svjetski tim, pa bi posluživanje sadržaja putem CDN-a bilo korisno.)

Nisam htio prisiliti tim na stvaranje računa kod drugog pružatelja usluge. Oni već imaju račune Active Directory i GitHub. To im smeta i stvara mi teret upravljanja.

Nažalost, nisam mogao pronaći takvu uslugu. GemFury je izvrstan, ali ne podržava GitHub autorizaciju (na nivou tima / organizacije), a Packagr uopće ne podržava GitHub autorizaciju. MyGet je također izvrstan, dopušta mi korištenje GitHub autorizacije, ali ne ugošćuje Python pakete. Azure DevOps ima nešto što izgleda obećavajuće, ali trenutno je u privatnoj beta verziji.

Srećom, to je moguće pomoću oblačnih Git spremišta kao što su GitHub, GitLab i BitBucket.

Pip može instalirati pakete iz Gita

Na GitHubu sam domaćin Python paketa (python_world), koji možete instalirati pomoću sljedeće naredbe (prije izvođenja ove naredbe i instaliranja mog koda na računalo budite sigurni da mi vjerujete).

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

Pip pruža mogućnosti za instalaciju iz glave, iz grane, iz oznake ili iz urezivanja. Obično označim svako izdanje i instaliram s tih oznaka. Potpune detalje potražite u dokumentaciji za instalaciju pipa.

Ovo je spremište javno, ali jednako funkcionira i s privatnim repoom, sve dok imate dopuštenje. Ne postoji posebna čarolija (radi se o paketu Python vanilije), a Setup.py većinu posla obavlja uobičajeno.

Ako ste novi u stvaranju Python paketa, tutorial o pakiranju Python projekata vrijedi ga brzo pročitati.

Setuptools također mogu instalirati ovisnosti iz Gita

Setuptools je način na koji većina ljudi stvara Python pakete.

Ugostio sam još jedan paket na GitHubu python_hello, što ovisi o python_world. (Siguran sam da možete vidjeti kamo ovo vodi.)

Relevantni bitovi iz setup.py nalaze se u nastavku. install_requiresodređuje koja python_worldje potrebna ovisnost i govori Setuptoolsu gdje je mogu pronaći.

install_requires=[ '[email protected]+//github.com/ceddlyburge/python_world#egg=python_world-0.0.1', ]

Ovaj paket možete instalirati pomoću naredbe u nastavku. Također će preuzeti ovisni python_worldpaket.

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

Ovo povezuje s određenom verzijom python_world, što je šteta jer znači da pip ne može upravljati ovisnostima (poput izrade prihvatljive verzije ako se na nju oslanja više stvari). Međutim, do kraja ovog članka uklonit ćemo potrebu za određenom vezom.

Python okruženja

Kao što znaju svi koji su koristili Python bez okoline, okoline štede puno frustracija i izgubljenog vremena. Dakle, moramo ih podržati.

Stvorio sam repo (use-hello-world) koji se definira python_hellokao ovisnost u zahtjevima.txt za Virtualenv i environment.yml za Conda.

Ako preuzmete repo, ovisnosti možete instalirati u virtualenv pomoću sljedeće naredbe.

pip install -r requirements.txt

Ako koristite conda, možete upotrijebiti ovu naredbu:

conda env create -n use-hello-world

Indeks PyPi

Do sada smo u mogućnosti instalirati pakete iz naših privatnih Git spremišta. Ovi paketi zauzvrat mogu definirati ovisnosti o drugim privatnim spremištima. Još uvijek nema PyPi poslužitelja na vidiku.

Mogli bismo se zaustaviti u ovom trenutku. Međutim, sintaksa definiranja ovisnosti pomalo je tajanstvena. Timu bi bilo teško otkriti koji su paketi dostupni, a mi povezujemo na određene verzije ovisnih paketa, umjesto da pipu dopustimo da njime upravlja.

Da bismo to popravili, možemo postaviti PyPi indeks koji odgovara Pep 503. Ova je specifikacija prilično jednostavna, a indeks sam upravo kreirao ručno. Ako ovo postane previše glomazno, mogu ga generirati iz GitHub API-ja.

Stvorio sam ovaj PyPi indeks koristeći GitHub stranice. Postoje jednake stvari za GitLab i BitBucket. Možete vidjeti da je izvorni kod vrlo jednostavan. Web stranice GitHub stranica uvijek su javne (a u vašem indeksu vjerojatno nema osjetljivih podataka). Međutim, ako vam trebaju da budu privatne, možete koristiti uslugu kao što je PrivateHub.

Na što treba paziti je normalizacija naziva specifikacije. To zahtijeva python_helloprisustvo podataka o paketu python-hello/index.html(imajte na umu promjenu donjeg crta do crtice).

Sada kada imamo PyPi poslužitelj, možemo instalirati pakete pomoću naredbe u nastavku.

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

Da biste mogli vidjeti kako ovo radi s okolinama, stvorio sam još jedan repo (use_hello_world_from_server) koji definira python_helloovisnost pomoću ovog PyPi indeksa umjesto izravnih GitHub veza. Ako pokušavate s Condom, potrebna je verzija> 4.4.

U ovom trenutku možemo se vratiti i ukloniti izravnu Git vezu u install_requires u setup.py python_hello (jer će je Setuptools moći pronaći s našeg poslužitelja).

Zaključci

Korištenje davatelja usluga Git koji je smješten u oblaku kao PyPi poslužitelj održiva je opcija. Ako ga već koristite, to znači da možete ponovno koristiti vjerodajnice i dozvole koje već imate. Radit će s Cloud Builder poslužiteljima i vjerojatno će se pružati putem CDN-a, pa će biti brz u cijelom svijetu. Za postavljanje je potrebno više znanja od hostiranog poslužitelja, ali vjerojatno isto ili manje od hostinga vašeg vlastitog poslužitelja u prostoriji.

Savjeti i savjeti

Lokalno posluživanje indeksa može pomoći u rješavanju problema (poput normalizacije naziva). Lako je vidjeti koji se zahtjevi podnose. Za to možete koristiti ugrađeni python HTTP poslužitelj ( python -m Http.Server -8000). To me dovelo do saznanja da pip searchkoristi postzahtjeve, pa neće raditi s GitHub stranicama.

Možete pokrenuti python setup.py -installda lokalno provjerite svoje pip pakete, prije nego što ih gurnete u Git.