Kuinka pakata python-projekti ja sen kaikki riippuvuudet offline-asennusta varten.

Kirjoitan tämän viestin osoittaakseni, miten mielestäni on oikea tapa python-sovellusten asentamiseen ja pakkaamiseen kaikista riippuvuuksistaan.

Usein sinulla on oltava paketti, jonka avulla voit asentaa sovelluksen ja sen riippuvuudet saavuttamatta lainkaan internetiä. Se voi olla etäpalvelin, jolla on pääsy vain sisäiseen verkkoon turvallisuussyistä, ja voi olla, että yksi riippuvuutesi isännöi yksityisessä git-arkistossa, etkä halua kovaan koodiin git-tunnusta asentaaksesi sen https: ään, esimerkiksi telakointiastiaan.

Lähestymistapanani on kammata SetupTools, DistUtils ja pip Wheel lopulliseen tar.gz-muotoon.

Oletan, että tunnet jo pakkauksen perusteet:
https://python-packaging.readthedocs.io/en/latest/minimal.html

Pythonin peruspakkaus vaatii vähintään setup.py-tiedoston projektin juuressa, minkä jälkeen voit soittaa python setup.py -luetteloon

setup.py ydin

Cmd-luokka on laajennus asennusohjelmiin ja on luokka, joka pakata koodin jakeluun, mutta myös kerää kaikki paketit vaatimuksista.txt arkistoon.
Tämä alla oleva käsikirjoitus (package.py) on setuptools-komentolaajennus jakelun luomiseksi projektista.
normaali python-asennusohjelma pakata vain tiedostot ja kansiot, kun tämä skripti menee yli
vaatimukset.txt tekee pyörän
(zip kuten arkisto) vaatimuksesta, joka on varastoitava ohjaushytti kansioon ja pakattava yhdessä
koodi yhtenä tar.gz-tiedostona.

Pakkausvaroitus:
Tämä skripti kerää asennetut (kootut) vaatimukset mistä se toimii, mikä tarkoittaa, että jos vaatimukset.txt sisältää vaatimuksia, jotka perustuvat C-laajennuksiin, kuten esimerkiksi psycopg, käännetty paketti kerätään.
Kun pakkaat arkiston määränpäähän, jos järjestelmä on erilainen kuin järjestelmä, josta olet kerännyt paketin, se ei toimi tarkoitetulla tavalla ja jopa kaatuu.

anna minun toistaa tämän uudelleen:
ubuntu! = centos! = macOS
python2.6! = ​​python2.7

Voit kuitenkin paketoida ubuntuun, kun kohdejärjestelmä on Debian, koska he ovat samaa perhettä.

pack.py ydin

Tämä skripti voi toimia vain samasta perheestä johtuen C-laajennuksista, jotka on koottava tietyille
alusta (ts. psycopg jne.).

Mitä tämä käsikirjoitus tekee:

Tämä skripti poistaa ja luo uudelleen ohjaushyt-kansion projektisi juuresta.

Sitten se kutsuu pip wheel -r rights.txt, joka kerää asennetut paketit nykyisestä ympäristöstä, johon ne on asennettu, ohjaustalon .whl-tiedostoihin, sitten komentosarja luo paikallisen vaatimukset.txt-tiedoston, jossa ei ole http-linkkejä siinä, vain paikallinen paketti Koska nimi on varastoituna ohjaushyttiin, syynä tähän on pipin toimintatapa.

Kun paketti on purettu kohdekohteeseen, vaatimukset voidaan asentaa paikallisesti ja offline-tilassa ohjauskeskuksen kansiosta käyttämällä vaihtoehtoa - no-index pip install, joka jättää huomiotta pakettihakemiston (tarkastellaan vain --find-links URL-osoitteita).
--haku-linkit etsii arkistoa URL-osoitteesta tai polusta.

Koska alkuperäisillä vaatimuksilla.txt saattaa olla linkkejä muuhun kuin rep-repoon, kuten Github (https) pip, jäsentää arkiston linkit URL-osoitteesta, ei ohjaustalosta, mikä johtaa http-pyyntöön.

Nämä toiminnot luovat uuden vaatimus.txt-tiedoston (se varmuuskopioi alkuperäiset vaatimukset.txt-tiedostoksi vaatimuksiin.orig ja palauttaa pakkaamisen jälkeen) t: llä vain kunkin paketin nimen ja version, mikä eliminoi tarpeen hakea / jäsentää linkkejä http-lähteet ja asenna kaikki arkistot täysin offline-tilaan ohjaushytistä.

Viimeinkin skripti kutsuu setuptools-luetteloon - joten voit muuttaa sen haluamaasi muotoon, jota setuptools tukee.

MANIFEST.in
Viimeinen osa ohjaushyttiä pakkaamisesta, joka meidän on kerrottava asennusvälineille sisällyttää tämä kansio arkistoon siirteen ohjaushytillä:

MANIFEST.sisällössä

Huomaa, että karsin (poistan / ohitan arkistosta) git-kansion itse.

Kokoamalla kaikki yhteen:
Luo tiedostot projektin juureen:

  • package.py
  • setup.py
  • MANIFEST.in

Soita python setup.py -paketti:
tämä poistaa ja luoda uudestaan ​​pyörähuoneen kansion projektin juuressa, sitten se kerää paketit ohjaustalon kansioon.
Viimeisessä vaiheessa arkisto luodaan projektin juurin dist-kansioon.

Tässä vaiheessa voit kopioida arkiston telakointikuvaan tai palvelimellesi haluamallasi tavalla.

Purkaminen pakkauksesta:
Voit purkaa pakkauksen yksinkertaisesti tar zxf archive.tar.gz ja soittaa sitten

pip-asennus -r vaatimukset.txt - käytä-pyörä - ei-hakemisto - etsi-linkit ohjaustalo

paketit asennetaan täysin offline-tilassa.

Bonusvinkki:
Jos aiot käyttää tätä arkistoa docker-säilössä, ehdotan, että rakennat python-docker-kuvan kaikilla gcc OpenSSL: llä ja muilla rakennuslevyillä, jotta asennat kaikki riippuvuudet tälle säilölle ja suorita setup.py-paketti jaettuun asennusalustaan ​​/ kopioon missä vain haluat. tällä tavalla suoritussäiliösi on laiha eikä tarvitse kaikkia raskaita rakennuslevyjä.