Szczeg贸艂owe por贸wnanie setup.py i pyproject.toml do zarz膮dzania pakietami Python, obejmuj膮ce najlepsze praktyki, strategie migracji i nowoczesne narz臋dzia.
Struktura pakiet贸w Pythona: Setup.py kontra Pyproject.toml - Kompletny przewodnik
Przez lata plik setup.py
by艂 kamieniem w臋gielnym zarz膮dzania pakietami Pythona. Jednak krajobraz ewoluowa艂, a pyproject.toml
wy艂oni艂 si臋 jako nowoczesna alternatywa. Ten kompletny przewodnik bada r贸偶nice mi臋dzy tymi dwoma podej艣ciami, pomagaj膮c zrozumie膰, kt贸re z nich jest odpowiednie dla Twojego projektu i jak efektywnie zarz膮dza膰 pakietami Pythona.
Zrozumienie Podstaw
Czym jest pakiet Pythona?
Pakiet Pythona to spos贸b na organizowanie i dystrybucj臋 kodu Pythona. Pozwala grupowa膰 powi膮zane modu艂y w hierarchi臋 katalog贸w, czyni膮c kod bardziej modu艂owym, wielokrotnego u偶ytku i 艂atwiejszym w utrzymaniu. Pakiety s膮 niezb臋dne do udost臋pniania kodu innym oraz do zarz膮dzania zale偶no艣ciami w projektach.
Rola Metadanych Pakietu
Metadane pakietu dostarczaj膮 kluczowych informacji o pakiecie, takich jak jego nazwa, wersja, autor, zale偶no艣ci i punkty wej艣cia. Metadane te s膮 wykorzystywane przez mened偶er贸w pakiet贸w, takich jak pip
, do instalowania, aktualizowania i zarz膮dzania pakietami. Historycznie, setup.py
by艂 g艂贸wnym sposobem definiowania tych metadanych.
Setup.py: Tradycyjne podej艣cie
Czym jest Setup.py?
setup.py
to skrypt Pythona, kt贸ry wykorzystuje bibliotek臋 setuptools
do definiowania struktury i metadanych pakietu. Jest to plik wykonywany dynamicznie, co oznacza, 偶e uruchamia kod Pythona w celu skonfigurowania pakietu.
Kluczowe komponenty Setup.py
Typowy plik setup.py
zawiera nast臋puj膮ce komponenty:
- Nazwa pakietu: Nazwa Twojego pakietu (np.
my_package
). - Wersja: Numer wersji Twojego pakietu (np.
1.0.0
). - Informacje o autorze i opiekunie: Szczeg贸艂y dotycz膮ce autora i opiekuna pakietu.
- Zale偶no艣ci: Lista innych pakiet贸w, od kt贸rych Tw贸j pakiet zale偶y (np.
requests >= 2.20.0
). - Punkty wej艣cia: Definicje dla skrypt贸w wiersza polece艅 lub innych punkt贸w wej艣cia do Twojego pakietu.
- Dane pakietu: Pliki inne ni偶 kod (np. pliki konfiguracyjne, pliki danych), kt贸re powinny by膰 do艂膮czone do pakietu.
Przyk艂ad 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', ], ) ```Zalety Setup.py
- Znajomo艣膰: Jest to tradycyjne i dobrze znane podej艣cie, wi臋c wielu programist贸w jest ju偶 z nim zaznajomionych.
- Elastyczno艣膰: Poniewa偶 jest to skrypt Pythona, oferuje wysoki stopie艅 elastyczno艣ci. Mo偶esz wykonywa膰 z艂o偶on膮 logik臋 i dostosowywa膰 proces budowania wed艂ug potrzeb.
- Rozszerzalno艣膰: Setuptools zapewnia bogaty zestaw funkcji i mo偶e by膰 rozszerzany o niestandardowe polecenia i rozszerzenia.
Wady Setup.py
- Dynamiczne wykonanie: Dynamiczny charakter pliku
setup.py
mo偶e stanowi膰 ryzyko bezpiecze艅stwa, poniewa偶 wykonuje on dowolny kod podczas procesu budowania. - Niejawne zale偶no艣ci:
setup.py
cz臋sto opiera si臋 na niejawnych zale偶no艣ciach, takich jak samo setuptools, co mo偶e prowadzi膰 do niesp贸jno艣ci i b艂臋d贸w. - Z艂o偶ono艣膰: W przypadku z艂o偶onych projekt贸w, plik
setup.py
mo偶e sta膰 si臋 du偶y i trudny do utrzymania. - Ograniczona konfiguracja deklaratywna: Wiele metadanych pakietu jest definiowanych imperatywnie, a nie deklaratywnie, co utrudnia ich zrozumienie.
Pyproject.toml: Nowoczesna alternatywa
Czym jest Pyproject.toml?
pyproject.toml
to plik konfiguracyjny, kt贸ry wykorzystuje format TOML (Tom's Obvious, Minimal Language) do definiowania systemu budowania i metadanych pakietu. Jest to podej艣cie deklaratywne, co oznacza, 偶e okre艣lasz, co chcesz osi膮gn膮膰, a nie jak to osi膮gn膮膰.
Kluczowe sekcje Pyproject.toml
Typowy plikpyproject.toml
zawiera nast臋puj膮ce sekcje:
[build-system]
: Definiuje system budowania do u偶ycia (np.setuptools
,poetry
,flit
).[project]
: Zawiera metadane projektu, takie jak nazwa, wersja, opis, autorzy i zale偶no艣ci.[tool.poetry]
or[tool.flit]
: Sekcje dla konfiguracji specyficznych dla narz臋dzi (np. Poetry, Flit).
Przyk艂ad Pyproject.toml (z Setuptools)
```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" ```Przyk艂ad Pyproject.toml (z Poetry)
```toml [tool.poetry] name = "my_package" version = "1.0.0" description = "A simple Python package" authors = ["John DoeZalety Pyproject.toml
- Konfiguracja deklaratywna:
pyproject.toml
zapewnia deklaratywny spos贸b definiowania metadanych pakietu, co u艂atwia jego zrozumienie i utrzymanie. - Ustandaryzowany system budowania: Okre艣la system budowania do u偶ycia, zapewniaj膮c sp贸jne kompilacje w r贸偶nych 艣rodowiskach.
- Ulepszone zarz膮dzanie zale偶no艣ciami: Narz臋dzia takie jak Poetry i Pipenv p艂ynnie integruj膮 si臋 z
pyproject.toml
, aby zapewni膰 solidne funkcje zarz膮dzania zale偶no艣ciami. - Zmniejszone ryzyko bezpiecze艅stwa: Poniewa偶 jest to statyczny plik konfiguracyjny, eliminuje ryzyko bezpiecze艅stwa zwi膮zane z dynamicznym wykonywaniem kodu podczas procesu budowania.
- Integracja z nowoczesnymi narz臋dziami:
pyproject.toml
jest standardem dla nowoczesnych narz臋dzi do pakowania Pythona, takich jak Poetry, Pipenv i Flit.
Wady Pyproject.toml
- Krzywa uczenia si臋: Programi艣ci mog膮 potrzebowa膰 nauczy膰 si臋 nowej sk艂adni (TOML) i nowego sposobu my艣lenia o zarz膮dzaniu pakietami.
- Ograniczona elastyczno艣膰: Mo偶e nie by膰 odpowiedni do wysoce niestandardowych proces贸w budowania, kt贸re wymagaj膮 z艂o偶onej logiki.
- Zale偶no艣膰 od narz臋dzi: B臋dziesz musia艂 wybra膰 i nauczy膰 si臋 u偶ywa膰 konkretnego systemu budowania (np. Setuptools, Poetry, Flit).
Por贸wnanie Setup.py i Pyproject.toml
Poni偶ej znajduje si臋 tabela podsumowuj膮ca kluczowe r贸偶nice mi臋dzy setup.py
a pyproject.toml
:
Cecha | Setup.py | Pyproject.toml |
---|---|---|
Styl konfiguracji | Imperatywny (kod Pythona) | Deklaratywny (TOML) |
System budowania | Niejawny (Setuptools) | Jawny (okre艣lony w [build-system] ) |
Bezpiecze艅stwo | Potencjalnie mniej bezpieczny (dynamiczne wykonanie) | Bardziej bezpieczny (konfiguracja statyczna) |
Zarz膮dzanie zale偶no艣ciami | Podstawowe (install_requires ) |
Zaawansowane (integracja z Poetry, Pipenv) |
Narz臋dzia | Tradycyjne (Setuptools) | Nowoczesne (Poetry, Pipenv, Flit) |
Elastyczno艣膰 | Wysoka | Umiarkowana |
Z艂o偶ono艣膰 | Mo偶e by膰 wysoka dla z艂o偶onych projekt贸w | Generalnie ni偶sza |
Strategie migracji: z Setup.py do Pyproject.toml
Migracja z setup.py
do pyproject.toml
mo偶e wydawa膰 si臋 zniech臋caj膮ca, ale jest to op艂acalna inwestycja w d艂ugoterminow膮 utrzymywalno艣膰 i sp贸jno艣膰. Oto kilka strategii, kt贸rych mo偶esz u偶y膰:
1. Zacznij od minimalnego Pyproject.toml
Utw贸rz podstawowy plik pyproject.toml
, kt贸ry okre艣la system budowania, a nast臋pnie stopniowo migruj metadane z setup.py
do pyproject.toml
.
2. U偶yj Setuptools z Pyproject.toml
Kontynuuj u偶ywanie Setuptools jako systemu budowania, ale zdefiniuj metadane projektu w pyproject.toml
. Pozwala to wykorzysta膰 zalety pyproject.toml
, jednocze艣nie u偶ywaj膮c znanego narz臋dzia.
3. Migruj do nowoczesnego narz臋dzia, takiego jak Poetry
Rozwa偶 migracj臋 do nowoczesnego narz臋dzia, takiego jak Poetry lub Pipenv. Narz臋dzia te zapewniaj膮 kompleksowe funkcje zarz膮dzania zale偶no艣ciami i p艂ynnie integruj膮 si臋 z pyproject.toml
.
Przyk艂ad: Migracja do Poetry
- Zainstaluj Poetry:
pip install poetry
- Zainicjuj Poetry w swoim projekcie:
poetry init
(To poprowadzi Ci臋 przez proces tworzenia plikupyproject.toml
) - Dodaj swoje zale偶no艣ci:
poetry add requests
(lub inne zale偶no艣ci) - Zbuduj sw贸j pakiet:
poetry build
4. U偶yj narz臋dzi do zautomatyzowanej migracji
Niekt贸re narz臋dzia mog膮 pom贸c zautomatyzowa膰 proces migracji. Na przyk艂ad, mo偶esz u偶y膰 narz臋dzi do konwersji pliku setup.py
na plik pyproject.toml
.
Najlepsze praktyki w zarz膮dzaniu pakietami Pythona
1. U偶yj 艣rodowiska wirtualnego
Zawsze u偶ywaj 艣rodowiska wirtualnego, aby izolowa膰 zale偶no艣ci projektu od globalnej instalacji Pythona. Zapobiega to konfliktom i zapewnia, 偶e Tw贸j projekt ma prawid艂owe zale偶no艣ci.
Przyk艂ad u偶ycia venv
:
Przyk艂ad u偶ycia conda
:
2. Dok艂adnie okre艣l zale偶no艣ci
U偶yj ogranicze艅 wersji, aby okre艣li膰 kompatybilne wersje swoich zale偶no艣ci. Zapobiega to nieoczekiwanym zachowaniom spowodowanym niekompatybilnymi aktualizacjami bibliotek. U偶yj narz臋dzi takich jak pip-tools
do zarz膮dzania zale偶no艣ciami.
Przyk艂ad specyfikacji zale偶no艣ci:
``` requests >= 2.20.0, < 3.0.0 ```3. U偶yj sp贸jnego systemu budowania
Wybierz system budowania (np. Setuptools, Poetry, Flit) i trzymaj si臋 go. Zapewnia to sp贸jne kompilacje w r贸偶nych 艣rodowiskach i upraszcza proces pakowania.
4. Udokumentuj sw贸j pakiet
Napisz jasn膮 i zwi臋z艂膮 dokumentacj臋 dla swojego pakietu. Pomaga to u偶ytkownikom zrozumie膰, jak korzysta膰 z Twojego pakietu i u艂atwia innym wk艂ad w Tw贸j projekt. U偶yj narz臋dzi takich jak Sphinx do generowania dokumentacji z kodu.
5. U偶yj ci膮g艂ej integracji (CI)
Skonfiguruj system CI (np. GitHub Actions, Travis CI, GitLab CI), aby automatycznie budowa膰, testowa膰 i wdra偶a膰 Tw贸j pakiet za ka偶dym razem, gdy wprowadzane s膮 zmiany w kodzie. Pomaga to zapewni膰, 偶e Tw贸j pakiet jest zawsze w dzia艂aj膮cym stanie.
Przyk艂ad konfiguracji GitHub Actions:
```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. Opublikuj sw贸j pakiet w PyPI
Udost臋pnij sw贸j pakiet 艣wiatu, publikuj膮c go w Python Package Index (PyPI). U艂atwia to innym instalowanie i u偶ywanie Twojego pakietu.
Kroki do publikacji w PyPI:
- Zarejestruj konto na PyPI i TestPyPI.
- Zainstaluj
twine
:pip install twine
. - Zbuduj sw贸j pakiet:
poetry build
lubpython setup.py sdist bdist_wheel
. - Prze艣lij sw贸j pakiet do TestPyPI:
twine upload --repository testpypi dist/*
. - Prze艣lij sw贸j pakiet do PyPI:
twine upload dist/*
.
Przyk艂ady z prawdziwego 艣wiata
Przyjrzyjmy si臋, jak niekt贸re popularne projekty Pythona u偶ywaj膮 pyproject.toml
:
- Poetry: U偶ywa
pyproject.toml
do w艂asnego zarz膮dzania pakietami. - Black: Bezkompromisowy formatator kodu r贸wnie偶 wykorzystuje
pyproject.toml
. - FastAPI: Nowoczesny, szybki (wysokowydajny) framework webowy do budowania API w Pythonie r贸wnie偶 go u偶ywa.
Podsumowanie
pyproject.toml
reprezentuje nowoczesny standard zarz膮dzania pakietami Pythona, oferuj膮c deklaratywny i bezpieczny spos贸b definiowania metadanych pakietu i zarz膮dzania zale偶no艣ciami. Chocia偶 setup.py
dobrze nam s艂u偶y艂, migracja do pyproject.toml
jest warto艣ciow膮 inwestycj膮 w d艂ugoterminow膮 utrzymywalno艣膰, sp贸jno艣膰 i integracj臋 z nowoczesnymi narz臋dziami. Przyjmuj膮c najlepsze praktyki i wykorzystuj膮c odpowiednie narz臋dzia, mo偶esz usprawni膰 sw贸j proces pakowania Pythona i tworzy膰 wysokiej jako艣ci, wielokrotnie u偶ywalne pakiety.