Python'un gücü, geniş üçüncü taraf kütüphane ekosistemindedir. Ancak birçok geliştirici için, bir komut dosyası yazmaktan sağlam bir paket dağıtmaya kadar olan yol, hala bir kara kutu olmaya devam ediyor. Kod paylaşmak, açık kaynak projelerde işbirliği yapmak veya özel bir dizine iç araçlar yayınlamak isteyen herhangi bir orta ve ileri düzey geliştirici için Python projelerini düzgün bir şekilde paketleme, oluşturma ve dağıtma konusunda bilgi sahibi olmak esastır.
Bu kılavuzda, modern Python paketleme manzarasını aydınlatıyoruz. Python Paketleme Otoritesi (PyPA) tarafından önerilen daha yeni ve daha sağlam standartları benimsemek için eski setup.py monolitinden uzaklaşacağız.
Setuptools'tan PEP 517/518'e Geçiş
Tarihsel olarak Python paketleme, büyük ölçüde setuptools ve uzun bir setup.py dosyasına dayanıyordu. İşlevsel olsa da, bu yaklaşım genellikle kırılgan derlemelere ve yapılandırma dağınıklığına yol açıyordu. Topluluk, PEP 517 ve PEP 518'de tanımlanan standartlaştırılmış derleme arka uçlarına doğru ilerlemiştir.
Yeni standart iki temel dosya tanıtmaktadır:
- pyproject.toml: Derleme gereksinimlerini ve proje meta verilerini bildirir.
- derleme arka ucu: Asıl derlemeyi gerçekleştiren
setuptools,poetryveyaflitgibi bir araç.
Proje Yapınızı Tanımlama
Temiz bir proje yapısı, sürdürülebilir bir paketin temelidir. Birçok varyasyon olmasına rağmen, yaygın bir modern düzen şöyledir:
my_package/
├── pyproject.toml
├── README.md
├── LICENSE
└── src/
└── my_package/
├── __init__.py
├── core.py
└── utils.py
Bir src/ düzeni kullanılması şiddetle tavsiye edilir. Bu, testler sırasında yerel dosyaların yanlışlıkla içe aktarılmasını önler ve yüklü paketin, her zaman test edilen paket olmasını sağlar; yani mevcut dizindeki kaynak kodu değil.
pyproject.toml Yapılandırması
pyproject.toml dosyası, projenizin meta verileri için tek doğru kaynaktır. Aşağıda, en yaygın olarak benimsenen standart olan derleme arka ucu olarak setuptools kullanan bir örnek yapılandırma bulunmaktadır.
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
[project]
name = "my-awesome-package"
version = "0.1.0"
description = "Gösteri amaçlı örnek bir Python paketi."
readme = "README.md"
license = {text = "MIT"}
requires-python = ">=3.8"
authors = [
{name = "Jane Developer", email = "jane@example.com"},
]
dependencies = [
"requests>=2.28.0",
"click>=8.0.0",
]
[project.optional-dependencies]
dev = [
"pytest>=7.0.0",
"black>=22.0.0",
]
Bu yapılandırmada dikkat edilmesi gereken temel özellikler:
- Dinamik meta veriler: Manuel güncellemelerden kaçınmak için sürüm numaralarını ayrı dosyalarda tutabilirsiniz.
- İsteğe bağlı bağımlılıklar: Kullanıcılar
pip install my-package[dev]aracılığıyla geliştirici araçlarını yükleyebilir. - Python sürümü kısıtlaması:
requires-python'ı açıkça tanımlamak, uyumluluk kontrollerini sağlar.
Oluşturma ve Dağıtma
pyproject.toml yapılandırıldıktan sonra, paketinizi oluşturmak basittir. İlk olarak, en son derleme araçlarının yüklü olduğundan emin olun:
pip install build twine
Ardından, proje kök dizininden derleme komutunu çalıştırın. Bu komut, bir kaynak dağıtımı (sdist) ve bir wheel dosyası içeren bir dist/ dizini oluşturur.
python -m build
Çıktı şu şekilde görünecektir:
Creating sdist archive: dist/my_awesome_package-0.1.0.tar.gz
Creating wheel archive: dist/my_awesome_package-0.1.0-py3-none-any.whl
Sdist, kaynak kodu içerir ve kullanıcının kurulum sırasında wheel'i oluşturması için ortamının gereklidir. Wheel, kurulum için hazır olan, genellikle daha hızlı olan ve çoğu kullanım durumu için tercih edilen bir derlenmiş dağıtımdır.
Yayınlamadan Önce Test Etme
Asla doğrudan canlı PyPI dizinine yayınlamayın. Bunun yerine, test için ayrı bir örnek olan TestPyPI'yi kullanın.
- test.pypi.org adresinde bir hesap oluşturun.
- Hesap ayarlarınızda bir API belirteci oluşturun.
- Paketinizi
twinekullanarak yükleyin:
twine upload --repository testpypi dist/*
Ardından, temiz bir sanal ortamda kurulumu test edebilirsiniz:
pip install --index-url https://test.pypi.org/simple/ --no-deps my-awesome-package
Sonuç
Python paketleme, standartlaşma ve kullanım kolaylığına doğru ilerleyerek önemli ölçüde gelişmiştir. Modern araçları benimseyerek ve src/ düzeni ile uygun pyproject.toml yapılandırması gibi en iyi uygulamaları takip ederek, paketlerinizin sağlam, tekrarlanabilir ve başkaları tarafından tüketilmesi kolay olmasını sağlarsınız. İster toplulukla bir kütüphane paylaşın, ister iç araçları dağıtın, bu adımları ustalaşmak, modern Python geliştiricisinin araç setinde kritik bir beceridir.