Útmutató Python csomagok PyPI-on keresztüli terjesztéséhez: verziókezelés, eszközök és munkafolyamatok globális fejlesztőknek.
Python Csomagok Terjesztése: PyPI Közzététel és Verziókezelés
A Python kiterjedt ökoszisztĂ©máját egy hatalmas csomaggyűjtemĂ©ny táplálja, amely könnyen elĂ©rhetĹ‘ a Python Package Index (PyPI) rĂ©vĂ©n. Ez az ĂştmutatĂł átfogĂł áttekintĂ©st nyĂşjt arrĂłl, hogyan terjesztheti saját Python csomagjait a PyPI-on keresztĂĽl, biztosĂtva, hogy azok világszerte elĂ©rhetĹ‘ek legyenek a fejlesztĹ‘k számára. FelfedezzĂĽk az alapvetĹ‘ eszközöket, a verziĂłkezelĂ©s legjobb gyakorlatait, valamint a magas minĹ‘sĂ©gű Python csomagok lĂ©trehozásának Ă©s közzĂ©tĂ©telĂ©nek munkafolyamatait.
Miért érdemes terjeszteni a Python csomagját?
A Python csomagjának terjesztése számos előnnyel jár:
- A munkája megosztása: LehetĹ‘vĂ© teszi más fejlesztĹ‘k számára, hogy könnyen Ăşjra felhasználják a kĂłdját, elĹ‘segĂtve az egyĂĽttműködĂ©st Ă©s az innováciĂłt. KĂ©pzeljen el egy globális csapatot, amely az Ă–n speciális, Pythonban Ă©pĂtett adatelemzĹ‘ eszközeit használja.
- FĂĽggĹ‘sĂ©gkezelĂ©s: EgyszerűsĂti a fĂĽggĹ‘sĂ©gek kezelĂ©sĂ©nek folyamatát más projektekben. A csomagja egyetlen paranccsal telepĂthetĹ‘, az összes fĂĽggĹ‘sĂ©gĂ©vel egyĂĽtt.
- NyĂlt forráskĂłdĂş hozzájárulás: LehetĹ‘vĂ© teszi, hogy hozzájáruljon a nyĂlt forráskĂłdĂş közössĂ©ghez Ă©s elismerĂ©st szerezzen a munkájáért. Számos kritikus szoftverkomponens nyĂlt forráskĂłdĂş csomag, amelyet világszerte fejlesztĹ‘k tartanak karban.
- VerziĂłkezelĂ©s Ă©s frissĂtĂ©sek: Strukturált mĂłdot biztosĂt a verziĂłk kezelĂ©sĂ©re, frissĂtĂ©sek kiadására Ă©s hibajavĂtások kezelĂ©sĂ©re. Ez biztosĂtja, hogy a felhasználĂłk mindig a csomag legĂşjabb Ă©s legmegbĂzhatĂłbb verziĂłjához fĂ©rjenek hozzá.
- Könnyű telepĂtĂ©s: EgyszerűsĂti a telepĂtĂ©st a felhasználĂłk számára a `pip install az-on-csomag-neve` paranccsal.
Alapvető eszközök a Python csomagok terjesztéséhez
Számos eszköz elengedhetetlen a Python csomagok létrehozásához és terjesztéséhez:
- setuptools: Széles körben használt könyvtár a csomag metaadatainak meghatározására, beleértve a nevet, verziót, függőségeket és belépési pontokat. Ez a de facto szabvány a Python projektek csomagolására.
- wheel: Olyan terjesztĂ©si formátum, amely hatĂ©konyabb Ă©s megbĂzhatĂłbb telepĂtĂ©si folyamatot biztosĂt a forrás terjesztĂ©sekhez kĂ©pest. A wheel-ek elĹ‘re lefordĂtott terjesztĂ©sek, amelyek fordĂtás nĂ©lkĂĽl telepĂthetĹ‘k.
- twine: Eszköz a csomag biztonságos feltöltĂ©sĂ©re a PyPI-ra. A Twine titkosĂtja a hitelesĂtĹ‘ adatait Ă©s a csomagadatokat az átvitel során, vĂ©delmet nyĂşjtva a lehallgatás Ă©s a man-in-the-middle támadások ellen.
- venv/virtualenv: Ezek az eszközök izolált Python környezetek létrehozására szolgálnak. A virtuális környezetek használata kulcsfontosságú a függőségek kezeléséhez és a különböző projektek közötti konfliktusok elkerüléséhez.
A projekt beállĂtása
Mielőtt terjeszthetné a csomagját, helyesen kell strukturálnia a projektjét.
Projektstruktúra példa
my_package/ ├── my_package/ │ ├── __init__.py │ ├── module1.py │ └── module2.py ├── tests/ │ ├── __init__.py │ ├── test_module1.py │ └── test_module2.py ├── README.md ├── LICENSE ├── setup.py └── .gitignore
Magyarázat:
- my_package/: A csomag forráskódját tartalmazó fő könyvtár.
- my_package/__init__.py: A `my_package` könyvtárat Python csomaggá teszi. Lehet üres vagy tartalmazhat inicializációs kódot.
- my_package/module1.py, my_package/module2.py: Az Ön Python moduljai, amelyek a tényleges kódot tartalmazzák.
- tests/: Az egysĂ©gteszteket tartalmazĂł könyvtár. A tesztek Ărása kulcsfontosságĂş a csomag minĹ‘sĂ©gĂ©nek Ă©s megbĂzhatĂłságának biztosĂtásához.
- README.md: Egy Markdown fájl, amely leĂrást, használati utasĂtásokat Ă©s egyĂ©b releváns informáciĂłkat tartalmaz a csomagrĂłl. Gyakran ez az elsĹ‘ dolog, amit a felhasználĂłk a PyPI-on látnak.
- LICENSE: A licencet tartalmazó fájl, amely alatt a csomagot terjesztik (pl. MIT, Apache 2.0, GPL). A megfelelő licenc kiválasztása elengedhetetlen annak meghatározásához, hogy mások hogyan használhatják a kódját.
- setup.py: A fĹ‘ konfiguráciĂłs fájl, amely meghatározza a csomag metaadatait Ă©s a buildelĂ©si utasĂtásokat.
- .gitignore: Meghatározza azokat a fájlokat Ă©s könyvtárakat, amelyeket a Git-nek figyelmen kĂvĂĽl kell hagynia (pl. ideiglenes fájlok, build artifactek).
A `setup.py` fájl létrehozása
A `setup.py` fájl a csomag terjesztĂ©sĂ©nek szĂve. Metaadatokat tartalmaz a csomagrĂłl, valamint utasĂtásokat az Ă©pĂtĂ©sĂ©hez Ă©s telepĂtĂ©sĂ©hez. ĂŤme egy pĂ©lda:
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="my_package", # Cserélje le a csomag nevére
version="0.1.0",
author="Az Ön neve", # Cserélje le a saját nevére
author_email="az.on.emailje@example.com", # CserĂ©lje le az e-mail cĂmĂ©re
description="Egy kis példacsomag",
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/az-on-felhasznaloneve/my_package", # Cserélje le a repository URL-jére
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.6',
install_requires=[
"requests", # Példa függőség
],
)
Magyarázat:
- name: A csomag neve, amelyet a PyPI-on használni fognak. Válasszon egyedi Ă©s leĂrĂł nevet.
- version: A csomag verziószáma. Kövesse a szemantikus verziókezelést (lásd alább).
- author, author_email: Az Ă–n neve Ă©s e-mail cĂme.
- description: A csomag rövid leĂrása.
- long_description: Hosszabb, rĂ©szletesebb leĂrás, általában a `README.md` fájlbĂłl beolvasva.
- long_description_content_type: Meghatározza a hosszĂş leĂrás formátumát (pl. "text/markdown").
- url: A csomag honlapjának URL-je (pl. GitHub repository).
- packages: A terjesztésbe belefoglalandó csomagok listája. A `setuptools.find_packages()` automatikusan felfedezi a projekt összes csomagját.
- classifiers: Metaadatok, amelyek segĂtenek a felhasználĂłknak megtalálni a csomagot a PyPI-on. Válasszon megfelelĹ‘ osztályozĂłkat a Trove Classifiers listájábĂłl. Fontolja meg a támogatott Python verziĂłk, operáciĂłs rendszerek Ă©s licencek osztályozĂłinak felvĂ©telĂ©t.
- python_requires: Meghatározza a csomag használatához szükséges minimális Python verziót.
- install_requires: A csomag által igĂ©nyelt fĂĽggĹ‘sĂ©gek listája. Ezek a fĂĽggĹ‘sĂ©gek automatikusan telepĂĽlnek a csomag telepĂtĂ©sekor.
Verziókezelés: Szemantikus Verziókezelés
A Szemantikus VerziĂłkezelĂ©s (SemVer) egy szĂ©les körben elfogadott verziĂłkezelĂ©si sĂ©ma, amely világos Ă©s következetes mĂłdot biztosĂt a csomagban bekövetkezett változások jellegĂ©nek közlĂ©sĂ©re.
A SemVer verziószám három részből áll: MAJOR.MINOR.PATCH.
- MAJOR: Akkor növeljĂĽk, ha inkompatibilis API változtatásokat hajtunk vĂ©gre. Ez jelentĹ‘s változást jelez, amely megkövetelheti a felhasználĂłktĂłl a kĂłdjuk frissĂtĂ©sĂ©t.
- MINOR: Akkor növeljük, ha visszamenőlegesen kompatibilis módon adunk hozzá funkcionalitást. Ez új funkciókat vagy fejlesztéseket jelent, amelyek nem törik meg a meglévő kódot.
- PATCH: Akkor növeljĂĽk, ha visszamenĹ‘legesen kompatibilis hibajavĂtásokat vĂ©gzĂĽnk. Ez kisebb javĂtásokra szolgál, amelyek nem adnak hozzá Ăşj funkciĂłkat Ă©s nem törik meg a meglĂ©vĹ‘ funkcionalitást.
Példák:
- 1.0.0: Első kiadás.
- 1.1.0: Új funkció hozzáadása a meglévő kód megtörése nélkül.
- 1.0.1: Hiba javĂtása az 1.0.0-s kiadásban.
- 2.0.0: Inkompatibilis API változtatások végrehajtása.
A SemVer használata segĂt a felhasználĂłknak megĂ©rteni a csomag Ăşj verziĂłjára valĂł frissĂtĂ©s hatását.
A csomag elkĂ©szĂtĂ©se (buildelĂ©se)
Miután beállĂtotta a `setup.py` fájlt, elkĂ©szĂtheti a csomagot.
- Hozzon létre egy virtuális környezetet: Erősen ajánlott virtuális környezetet létrehozni a csomag függőségeinek izolálásához. Használja a `python3 -m venv .venv` (vagy `virtualenv .venv`) parancsot, majd aktiválja azt (`source .venv/bin/activate` Linuxon/macOS-en, `.venv\Scripts\activate` Windowson).
- TelepĂtse a build fĂĽggĹ‘sĂ©geket: Futtassa a `pip install --upgrade setuptools wheel` parancsot.
- ÉpĂtse fel a csomagot: Futtassa a `python setup.py sdist bdist_wheel` parancsot. Ez a parancs kĂ©t terjesztĂ©si fájlt hoz lĂ©tre a `dist` könyvtárban: egy forrás terjesztĂ©st (sdist) Ă©s egy wheel terjesztĂ©st (bdist_wheel).
Az `sdist` tartalmazza a forráskĂłdot Ă©s a `setup.py` fájlt. A `bdist_wheel` egy elĹ‘re lefordĂtott terjesztĂ©s, amely gyorsabban telepĂthetĹ‘.
A csomag közzététele a PyPI-on
MielĹ‘tt közzĂ©tehetnĂ© a csomagját, lĂ©tre kell hoznia egy fiĂłkot a PyPI-on (https://pypi.org/) Ă©s lĂ©tre kell hoznia egy API tokent. Ezt a tokent fogja használni a feltöltĂ©sek hitelesĂtĂ©sĂ©re.
- Regisztráljon a PyPI-on: Látogasson el a https://pypi.org/account/register/ oldalra és hozzon létre egy fiókot.
- Hozzon létre egy API tokent: Látogasson el a https://pypi.org/manage/account/ oldalra, görgessen le az "API tokens" szakaszhoz, és hozzon létre egy új tokent. Tárolja biztonságosan ezt a tokent, mivel szüksége lesz rá a csomag feltöltéséhez.
- TelepĂtse a Twine-t: Futtassa a `pip install twine` parancsot.
- Töltse fel a csomagját: Futtassa a `twine upload dist/*` parancsot. A rendszer kérni fogja a felhasználónevét (`__token__`) és a jelszavát (az Ön által létrehozott API token).
Fontos biztonsági megjegyzés: Soha ne kötelezze el (commit) az API tokenjét a repository-jába. Tárolja biztonságosan, és használjon környezeti változókat vagy más biztonságos módszereket a hozzáféréshez a feltöltési folyamat során.
A csomag telepĂtĂ©sĂ©nek tesztelĂ©se
A csomag közzĂ©tĂ©tele után elengedhetetlen tesztelni, hogy helyesen telepĂthetĹ‘-e.
- Hozzon lĂ©tre egy Ăşj virtuális környezetet: Ez biztosĂtja, hogy tiszta környezetben teszteli a telepĂtĂ©st.
- TelepĂtse a csomagját: Futtassa a `pip install az-on-csomag-neve` parancsot.
- Importálja és használja a csomagját: Egy Python interpreterben importálja a csomagot és ellenőrizze, hogy az elvárt módon működik-e.
Folyamatos IntegráciĂł Ă©s Folyamatos TelepĂtĂ©s (CI/CD)
A csomag Ă©pĂtĂ©sĂ©nek, tesztelĂ©sĂ©nek Ă©s közzĂ©tĂ©telĂ©nek automatizálásához használhat CI/CD eszközöket, mint pĂ©ldául a GitHub Actions, GitLab CI vagy Travis CI.
ĂŤme egy pĂ©lda egy GitHub Actions munkafolyamatra, amely felĂ©pĂti Ă©s közzĂ©teszi a csomagot a PyPI-on:
name: Közzététel a PyPI-on
on:
release:
types: [published]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.x
uses: actions/setup-python@v2
with:
python-version: 3.x
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Build package
run: python setup.py sdist bdist_wheel
- name: Publish package to PyPI
run: |
twine upload dist/* \
-u __token__ \
-p ${{ secrets.PYPI_API_TOKEN }}
Magyarázat:
- Ez a munkafolyamat akkor indul el, amikor új kiadás (release) jelenik meg a GitHubon.
- LekĂ©ri a kĂłdot, beállĂtja a Pythont, telepĂti a fĂĽggĹ‘sĂ©geket, felĂ©pĂti a csomagot, Ă©s feltölti a PyPI-ra.
- A
secrets.PYPI_API_TOKENegy GitHub titok (secret), amely a PyPI API tokenjĂ©t tárolja. Ezt a titkot a GitHub repository beállĂtásaiban kell konfigurálnia.
A Python csomagterjesztés legjobb gyakorlatai
- ĂŤrjon átfogĂł dokumentáciĂłt: KĂ©szĂtsen rĂ©szletes `README.md` fájlt, valamint API dokumentáciĂłt olyan eszközökkel, mint a Sphinx. A tiszta Ă©s teljes dokumentáciĂł kulcsfontosságĂş ahhoz, hogy a csomag könnyen használhatĂł legyen.
- ĂŤrjon egysĂ©gteszteket: Alaposan tesztelje a kĂłdját a minĹ‘sĂ©g Ă©s megbĂzhatĂłság biztosĂtása Ă©rdekĂ©ben. Használjon tesztelĂ©si keretrendszert, mint pĂ©ldául a pytest vagy az unittest.
- Kövesse a PEP 8 stĂlus ĂştmutatĂłt: Tartsa be a Python Enhancement Proposal 8 (PEP 8) stĂlus ĂştmutatĂłját a következetes Ă©s olvashatĂł kĂłd Ă©rdekĂ©ben.
- Használjon licencet: Válasszon megfelelĹ‘ nyĂlt forráskĂłdĂş licencet annak meghatározására, hogy mások hogyan használhatják a kĂłdját.
- Tartsa naprakĂ©szen a fĂĽggĹ‘sĂ©geit: Rendszeresen frissĂtse a csomag fĂĽggĹ‘sĂ©geit, hogy kihasználja a hibajavĂtásokat, biztonsági frissĂtĂ©seket Ă©s Ăşj funkciĂłkat.
- Használjon virtuális környezetet: Mindig virtuális környezetben fejlessze és tesztelje a csomagját a függőségek izolálása érdekében.
- Vegye fontolĂłra a nemzetköziesĂtĂ©st (i18n) Ă©s a honosĂtást (l10n): Ha a csomag felhasználĂłi felĂĽlettel rendelkezĹ‘ szöveget vagy adatot kezel, fontolja meg annak adaptálását kĂĽlönbözĹ‘ nyelvekre Ă©s rĂ©giĂłkra. Ez világszerte bĹ‘vĂti a potenciális felhasználĂłi bázist. Az olyan eszközök, mint a Babel, segĂthetnek ebben.
- Kezelje a különböző időzónákat és pénznemeket: Ha a csomag dátumokkal, időkkel vagy pénzügyi tranzakciókkal foglalkozik, legyen tekintettel a világ különböző időzónáira és pénznemeire. Használjon megfelelő könyvtárakat és API-kat ezen bonyolultságok helyes kezeléséhez.
- Adjon egyĂ©rtelmű hibaĂĽzeneteket: ĂŤrjon informatĂv hibaĂĽzeneteket, amelyek segĂtenek a felhasználĂłknak megĂ©rteni, mi ment rosszul Ă©s hogyan javĂthatják azt. FordĂtsa le ezeket a hibaĂĽzeneteket kĂĽlönbözĹ‘ nyelvekre, ha lehetsĂ©ges.
- Gondoljon az akadálymentessĂ©gre: Vegye figyelembe a fogyatĂ©kkal Ă©lĹ‘ felhasználĂłkat a csomag felĂĽletĂ©nek Ă©s dokumentáciĂłjának tervezĂ©sekor. Kövesse az akadálymentesĂtĂ©si irányelveket annak Ă©rdekĂ©ben, hogy a csomag mindenki számára használhatĂł legyen.
Haladó témák
- Névtér csomagok: Lehetővé teszik egyetlen Python csomag felosztását több könyvtárra, vagy akár több terjesztésre is.
- BelĂ©pĂ©si pontok: LehetĹ‘vĂ© teszik olyan fĂĽggvĂ©nyek vagy osztályok definiálását, amelyek más csomagokbĂłl vagy a parancssorbĂłl hĂvhatĂłk meg.
- Adatfájlok: Lehetővé teszik nem Python fájlok (pl. adatfájlok, konfigurációs fájlok) beillesztését a terjesztésbe.
- Feltételes függőségek: Lehetővé teszik olyan függőségek megadását, amelyek csak bizonyos feltételek mellett szükségesek (pl. egy adott operációs rendszeren).
Összegzés
A Python csomag PyPI-on törtĂ©nĹ‘ terjesztĂ©se nagyszerű mĂłdja annak, hogy megossza munkáját a világgal Ă©s hozzájáruljon a Python ökoszisztĂ©mához. Az ebben az ĂştmutatĂłban felvázolt lĂ©pĂ©sek Ă©s legjobb gyakorlatok követĂ©sĂ©vel kiválĂł minĹ‘sĂ©gű Python csomagokat hozhat lĂ©tre Ă©s tehet közzĂ©, amelyeket könnyű telepĂteni, használni Ă©s karbantartani. Ne feledje, hogy a csomag sikerĂ©nek Ă©rdekĂ©ben elĹ‘nyben kell rĂ©szesĂtenie a tiszta dokumentáciĂłt, az alapos tesztelĂ©st Ă©s a következetes verziĂłkezelĂ©st.