A setup.py és a pyproject.toml mélyreható összehasonlítása a Python csomagkezeléshez, a legjobb gyakorlatokat, a migrációs stratégiákat és a modern eszközöket is lefedve.
Python Csomagstruktúra: Setup.py vs. Pyproject.toml – Átfogó Útmutató
Évekig a setup.py
fájl volt a Python csomagkezelés sarokköve. Azonban a helyzet változott, és a pyproject.toml
egy modern alternatívaként jelent meg. Ez az átfogó útmutató feltárja a különbségeket e két megközelítés között, segítve Önt abban, hogy megértse, melyik a megfelelő a projektjéhez, és hogyan kezelheti hatékonyan a Python csomagjait.
Az alapok megértése
Mi az a Python Csomag?
A Python csomag egy módja a Python kód szervezésének és terjesztésének. Lehetővé teszi, hogy a kapcsolódó modulokat egy könyvtárszerkezetbe csoportosítsa, amiáltal a kód modulárisabb, újrafelhasználhatóbb és karbantarthatóbb lesz. A csomagok elengedhetetlenek a kód másokkal való megosztásához és a függőségek kezeléséhez a projektekben.
A Csomag Metaadatok Szerepe
A csomag metaadatai alapvető információkat nyújtanak a csomagjáról, például a nevét, verzióját, szerzőjét, függőségeit és belépési pontjait. Ezeket a metaadatokat a csomagkezelők, például a pip
használják a csomagok telepítéséhez, frissítéséhez és kezeléséhez. A múltban a setup.py
volt az elsődleges módja ezen metaadatok meghatározásának.
Setup.py: A Hagyományos Megközelítés
Mi az a Setup.py?
A setup.py
egy Python szkript, amely a setuptools
könyvtárat használja a csomag szerkezetének és metaadatainak meghatározásához. Ez egy dinamikusan végrehajtott fájl, ami azt jelenti, hogy Python kódot futtat a csomag konfigurálásához.
A Setup.py Főbb Összetevői
Egy tipikus setup.py
fájl a következő összetevőket tartalmazza:
- Csomag Neve: A csomag neve (pl.
my_package
). - Verzió: A csomag verziószáma (pl.
1.0.0
). - Szerző és Karbantartó Információi: Részletek a csomag szerzőjéről és karbantartójáról.
- Függőségek: A csomag által függő más csomagok listája (pl.
requests >= 2.20.0
). - Belépési Pontok: Parancssori szkriptek vagy más belépési pontok definíciói a csomagba.
- Csomag Adatok: Nem-kód fájlok (pl. konfigurációs fájlok, adatfájlok), amelyeket bele kell foglalni a csomagba.
Példa Setup.py
```python from setuptools import setup, find_packages setup( name='my_package', version='1.0.0', author='John Doe', author_email='john.doe@example.com', description='A simple Python package', packages=find_packages(), install_requires=[ 'requests >= 2.20.0', ], entry_points={ 'console_scripts': [ 'my_script = my_package.module:main', ], }, classifiers=[ 'Programming Language :: Python :: 3', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', ], ) ```A Setup.py Előnyei
- Ismerősség: Ez a hagyományos és jól ismert megközelítés, így sok fejlesztő már ismeri.
- Rugalmasság: Mivel ez egy Python szkript, nagyfokú rugalmasságot kínál. Bonyolult logikát hajthat végre, és testreszabhatja a build folyamatot szükség szerint.
- Bővíthetőség: A Setuptools gazdag funkciókészletet biztosít, és testreszabott parancsokkal és kiterjesztésekkel bővíthető.
A Setup.py Hátrányai
- Dinamikus Végrehajtás: A
setup.py
dinamikus jellege biztonsági kockázatot jelenthet, mivel tetszőleges kódot futtat a build folyamat során. - Implicit Függőségek: A
setup.py
gyakran támaszkodik implicit függőségekre, például magára a setuptools-ra, ami következetlenségekhez és hibákhoz vezethet. - Komplexitás: Bonyolult projektek esetén a
setup.py
nagyméretűvé és nehezen karbantarthatóvá válhat. - Korlátozott Deklaratív Konfiguráció: A csomag metaadatainak nagy része imperatívan van definiálva, nem deklaratívan, ami megnehezíti az indoklást.
Pyproject.toml: A Modern Alternatíva
Mi az a Pyproject.toml?
A pyproject.toml
egy konfigurációs fájl, amely a TOML (Tom's Obvious, Minimal Language) formátumot használja a build rendszer és a csomag metaadatainak meghatározására. Ez egy deklaratív megközelítés, ami azt jelenti, hogy meghatározza, mit szeretne elérni, nem pedig azt, hogyan érje el.
A Pyproject.toml Főbb Szekciói
Egy tipikuspyproject.toml
fájl a következő szekciókat tartalmazza:
[build-system]
: Meghatározza a használandó build rendszert (pl.setuptools
,poetry
,flit
).[project]
: Metaadatokat tartalmaz a projektről, például a nevét, verzióját, leírását, szerzőit és függőségeit.[tool.poetry]
vagy[tool.flit]
: Szekciók az eszközspecifikus konfigurációkhoz (pl. Poetry, Flit).
Példa Pyproject.toml (Setuptools-szal)
```toml [build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "my_package" version = "1.0.0" description = "A simple Python package" authors = [ { name = "John Doe", email = "john.doe@example.com" } ] dependencies = [ "requests >= 2.20.0", ] [project.scripts] my_script = "my_package.module:main" [project.optional-dependencies] dev = [ "pytest", "flake8", ] [project.classifiers] classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ] [project.urls] homepage = "https://example.com" repository = "https://github.com/example/my_package" ```Példa Pyproject.toml (Poetry-vel)
```toml [tool.poetry] name = "my_package" version = "1.0.0" description = "A simple Python package" authors = ["John DoeA Pyproject.toml Előnyei
- Deklaratív Konfiguráció: A
pyproject.toml
deklaratív módot kínál a csomag metaadatainak meghatározására, ami megkönnyíti a megértést és a karbantartást. - Szabványosított Build Rendszer: Meghatározza a használandó build rendszert, biztosítva a következetes buildeket különböző környezetekben.
- Továbbfejlesztett Függőségkezelés: Az olyan eszközök, mint a Poetry és a Pipenv zökkenőmentesen integrálódnak a
pyproject.toml
fájllal, hogy robusztus függőségkezelési funkciókat biztosítsanak. - Csökkentett Biztonsági Kockázatok: Mivel ez egy statikus konfigurációs fájl, kiküszöböli a dinamikusan végrehajtott kódokkal kapcsolatos biztonsági kockázatokat a build folyamat során.
- Integráció a Modern Eszközökkel: A
pyproject.toml
a szabvány a modern Python csomagolási eszközök, például a Poetry, a Pipenv és a Flit számára.
A Pyproject.toml Hátrányai
- Tanulási Görbe: A fejlesztőknek meg kell tanulniuk egy új szintaxist (TOML) és egy új gondolkodásmódot a csomagkezelésről.
- Korlátozott Rugalmasság: Előfordulhat, hogy nem alkalmas olyan nagymértékben testreszabott build folyamatokhoz, amelyek bonyolult logikát igényelnek.
- Eszköz Függőség: Ki kell választania és meg kell tanulnia egy adott build rendszer használatát (pl. Setuptools, Poetry, Flit).
Setup.py és Pyproject.toml Összehasonlítása
Íme egy táblázat, amely összefoglalja a legfontosabb különbségeket a setup.py
és a pyproject.toml
között:
Funkció | Setup.py | Pyproject.toml |
---|---|---|
Konfigurációs Stílus | Imperatív (Python kód) | Deklaratív (TOML) |
Build Rendszer | Implicit (Setuptools) | Explicit (megadva a [build-system] -ben) |
Biztonság | Potenciálisan kevésbé biztonságos (dinamikus végrehajtás) | Biztonságosabb (statikus konfiguráció) |
Függőségkezelés | Alap (install_requires ) |
Haladó (integráció a Poetry-vel, Pipenv-vel) |
Eszközök | Hagyományos (Setuptools) | Modern (Poetry, Pipenv, Flit) |
Rugalmasság | Magas | Mérsékelt |
Komplexitás | Bonyolult projektek esetén magas lehet | Általában alacsonyabb |
Migrációs Stratégiák: Setup.py-ról Pyproject.toml-re
Asetup.py
-ról a pyproject.toml
-re való migrálás ijesztőnek tűnhet, de érdemes befektetés a hosszú távú karbantarthatóság és következetesség érdekében. Íme néhány stratégia, amelyet használhat:
1. Kezdje egy Minimális Pyproject.toml fájllal
Hozzon létre egy alapvető pyproject.toml
fájlt, amely meghatározza a build rendszert, majd fokozatosan migrálja a metaadatokat a setup.py
-ról a pyproject.toml
-re.
2. Használja a Setuptools-ot a Pyproject.toml fájllal
Folytassa a Setuptools használatát build rendszerként, de a projekt metaadatait a pyproject.toml
-ben definiálja. Ez lehetővé teszi, hogy kihasználja a pyproject.toml
előnyeit, miközben továbbra is egy ismert eszközt használ.
3. Migráljon egy Modern Eszközre, például a Poetry-re
Fontolja meg a migrálást egy modern eszközre, például a Poetry-re vagy a Pipenv-re. Ezek az eszközök átfogó függőségkezelési funkciókat biztosítanak, és zökkenőmentesen integrálódnak a pyproject.toml
fájllal.
Példa: Migrálás a Poetry-re
- Telepítse a Poetry-t:
pip install poetry
- Inicializálja a Poetry-t a projektben:
poetry init
(Ez végigvezeti Önt egypyproject.toml
fájl létrehozásán) - Adja hozzá a függőségeit:
poetry add requests
(vagy bármilyen más függőséget) - Építse meg a csomagot:
poetry build
4. Használjon Eszközöket az Automatikus Migráláshoz
Egyes eszközök segíthetnek automatizálni a migrálási folyamatot. Használhat például eszközöket a setup.py
fájl pyproject.toml
fájllá konvertálásához.
A Python Csomagkezelés Bevált Gyakorlatai
1. Használjon Virtuális Környezetet
Mindig használjon virtuális környezetet a projekt függőségeinek elkülönítésére a rendszer egészére kiterjedő Python telepítéstől. Ez megakadályozza az ütközéseket, és biztosítja, hogy a projekt rendelkezzen a megfelelő függőségekkel.
Példa a venv
használatával:
Példa a conda
használatával:
2. Pontosan Adja meg a Függőségeket
Verziókorlátozások használatával adja meg a függőségek kompatibilis verzióit. Ez megakadályozza a nem kompatibilis könyvtárfrissítések által okozott váratlan viselkedést. Használjon olyan eszközöket, mint a pip-tools
a függőségek kezeléséhez.
Példa függőség megadásra:
``` requests >= 2.20.0, < 3.0.0 ```3. Használjon Következetes Build Rendszert
Válasszon egy build rendszert (pl. Setuptools, Poetry, Flit), és tartsa magát hozzá. Ez biztosítja a következetes buildeket különböző környezetekben, és leegyszerűsíti a csomagolási folyamatot.
4. Dokumentálja a Csomagját
Írjon világos és tömör dokumentációt a csomagjához. Ez segít a felhasználóknak megérteni, hogyan kell használni a csomagot, és megkönnyíti mások számára a projektben való közreműködést. Használjon olyan eszközöket, mint a Sphinx a dokumentáció generálásához a kódból.
5. Használjon Folyamatos Integrációt (CI)
Állítson be egy CI rendszert (pl. GitHub Actions, Travis CI, GitLab CI) a csomag automatikus buildeléséhez, teszteléséhez és telepítéséhez, valahányszor változtatásokat hajtanak végre a kódon. Ez segít biztosítani, hogy a csomag mindig működőképes állapotban legyen.
Példa GitHub Actions konfigurációra:
```yaml name: Python Package on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Python 3.9 uses: actions/setup-python@v4 with: python-version: 3.9 - name: Install dependencies run: | python -m pip install --upgrade pip pip install poetry poetry install - name: Lint with flake8 run: | poetry run flake8 . - name: Test with pytest run: | poetry run pytest ```6. Tegye Közzé a Csomagját a PyPI-n
Ossza meg csomagját a világgal úgy, hogy közzéteszi a Python Package Indexen (PyPI). Ez megkönnyíti mások számára a csomag telepítését és használatát.
Lépések a PyPI-n való közzétételhez:
- Regisztráljon egy fiókot a PyPI-n és a TestPyPI-n.
- Telepítse a
twine
-t:pip install twine
. - Építse meg a csomagot:
poetry build
vagypython setup.py sdist bdist_wheel
. - Töltse fel a csomagot a TestPyPI-re:
twine upload --repository testpypi dist/*
. - Töltse fel a csomagot a PyPI-re:
twine upload dist/*
.
Valós Példák
Nézzük meg, hogyan használják a népszerű Python projektek a pyproject.toml
fájlt:
- Poetry: Saját csomagkezelésére használja a
pyproject.toml
fájlt. - Black: A kompromisszumok nélküli kódformázó szintén a
pyproject.toml
fájlt használja. - FastAPI: Egy modern, gyors (nagy teljesítményű) webes keretrendszer API-k Pythonnal történő építéséhez szintén ezt használja.
Következtetés
A pyproject.toml
a modern szabványt képviseli a Python csomagkezelésben, deklaratív és biztonságos módot kínálva a csomag metaadatainak meghatározására és a függőségek kezelésére. Bár a setup.py
jól szolgált minket, a pyproject.toml
-re való migrálás érdemes befektetés a hosszú távú karbantarthatóság, következetesség és a modern eszközökkel való integráció érdekében. A bevált gyakorlatok elfogadásával és a megfelelő eszközök felhasználásával egyszerűsítheti a Python csomagolási munkafolyamatát, és kiváló minőségű, újrafelhasználható csomagokat hozhat létre.