Kuidas pakkida pythoni projekti koos kõigi selle sõltuvustega võrguühenduseta installimiseks?

Kirjutan seda postitust, et näidata, kuidas minu arvates on python-rakenduste kõigi nende sõltuvustega installimine ja pakkimine õige viis.

Sageli peab teil olema pakett, mille abil saate rakenduse installida, ja selle sõltuvused, ilma et peaksite üldse Internetti jõudma, see võib olla kaugserver, millel on turvalisuse kaalutlustel juurdepääs ainult sisemisele võrgule, ja võib juhtuda, et üks teie sõltuvustest hostitakse privaatses git-hoidlas ja te ei soovi git-tunnust kõvakodeerida, et installida see näiteks https-i (doki konteineri) kaudu.

Minu lähenemisviis on SetupTools, DistUtils ja pip Wheel kammimine tar.gz-vormingu saamiseks.

Ma eeldan, et olete juba tuttavad pakendamise põhitõdedega:
https://python-packaging.readthedocs.io/en/latest/minimal.html

Pythoni põhipakendamine nõuab projekti juurest minimaalselt setup.py-faili, mille abil saate helistada python setup.py sdist

setup.py sisu

Cmdclass on seadistustööriistade laiendus ja see on klass, mis pakendab levitamiskoodi, kuid kogub ka kõik paketid Nõuded.txt arhiivi.
See allpool olev skript (package.py) on setuptools-i käsulaiend projekti levitamise loomiseks.
tavaline pütoni seadistamise sdist pakkib ainult faile ja kaustu, samas kui see skript läheb üle
Nõuded.txt teeb ratta
(tõmblukuga arhiiv) nõudest säilitada roolikambrite kaustas ja pakkida need koos
kood ühe tar.gz-failina.

Pakendamise hoiatus:
See skript kogub installitud (kompileeritud) nõuded kohast, kus see töötab, see tähendab, et kui teie nõuded.txt sisaldab nõudeid, mis põhinevad C-laienditel, näiteks psycopg, siis kogutakse kompileeritud pakett.
Kui arhiivi pakite sihtkohast lahti, kui süsteem on erinev süsteemist, mille kogutasite, pakett sellest ei tööta nagu ette nähtud ja isegi krahhi.

las ma kordan seda uuesti:
ubuntu! = centos! = macOS
python2.6! = ​​python2.7

Kui sihtsüsteem on Debian, saate siiski paketti ubuntu panna, kuna nad on samad perekonnad.

pack.py sisu

Seda skripti saab käivitada samast perekonnast ainult C-laiendite tõttu, mis tuleb kompileerida konkreetsele
platvorm (st psycopg jne…).

Mida see skript teeb:

See skript kustutab teie projekti juurkatuse kausta roolikambrist ja taastab selle.

Seejärel kutsutakse see pip wheel -r rights.txt, mis kogub installitud paketid praegusest keskkonnast, kuhu nad on installitud, roolikambrisse .whl-failideks, siis loob skript kohaliku nõuded.txt faili ilma selles sisalduvate http-linkideta, vaid kohaliku paketiga kui nimi on roolikambris, on selle põhjuseks pipi tööpõhimõte.

Kui pakett on sihtkohas lahti pakitud, saab nõudeid kohapeal ja võrguühenduseta roolimajja kausta installida, valides --no-index pip installil, mis ignoreerib paketi indeksit (vaadates ainult --find-links URL-e).
--find-links otsib arhiivi URL-ist või teelt.

Kuna algsel Nõuded.txt-l võivad olla lingid mitte-pip-reposse, näiteks Github (https) pip, parsib arhiivi lingid URL-ist, mitte roolikambrist, mille tulemuseks on http-päring.

Selle funktsiooni abil luuakse uus nõuetele.txt (see varundab algsed nõudmised.txt kaustadesse Nõuded.orig ja taastab pärast pakkimist), kasutades ainult iga paketi nime ja versiooni, välistades seeläbi vajaduse linke tõmmata / parsida. http-allikad ja installige kõik arhiivid roolikambrist täiesti võrguühenduseta.

Lõpuks kutsub skript setuptools sdist - et saaksite selle muuta mis tahes soovitud formaadiks, mida setuptools toetab.

MANIFEST.in
Roolikambri pakendamise viimane osa, mille peame määrama töövahenditele, et lisada see kaust arhiivi, kasutades pookkorpust:

MANIFEST.sisest

Pange tähele, et ma lõikan (kustutan / arhiivist välja) git-kausta ise.

Kõike kokku panema:
Looge projekti juurfailid:

  • pakett.py
  • setup.py
  • MANIFEST.in

Helistage python setup.py paketile:
see kustutab ja loob projekti projekti juuril asuva roolikambrikausta uuesti, seejärel kogub see paketid roolikambrikausta.
Viimane samm loob arhiivi projekti juurkausta dist kausta.

Sel hetkel võite arhiivi kopeerida dokkuri pilti või oma serverisse mis tahes viisil.

Lahti pakkimine:
Paki lahti pakkimiseks lihtsalt tar zxf archive.tar.gz ja helistage siis

pip install - r rights.txt - kasutage ratast - ei indeksita - otsige linke roolikambrist

teie paketid installitakse täielikult võrguühenduseta.

Boonuse näpunäide:
Kui kavatsete selle arhiivi käitada dokkimis konteineris, soovitan teil ehitada pütoni doki pilt koos kõigi gcc OpenSSL-i ja muude ehitamislippudega, et installida kõik sõltuvused sellest konteinerist ja käivitada see setup.py pakett ühiskasutatavasse mahtu / koopiasse selles konteineris. kuhu iganes soovite. sel moel on teie käitusaegne konteiner lahja ega vaja kõiki raskekujulisi seadmeid.