Python Programming

Python Paketleme ve Dağıtımını Ustalaşma: Yerel Komut Dosyalarından PyPI'ye

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:

  1. pyproject.toml: Derleme gereksinimlerini ve proje meta verilerini bildirir.
  2. derleme arka ucu: Asıl derlemeyi gerçekleştiren setuptools, poetry veya flit gibi 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.

  1. test.pypi.org adresinde bir hesap oluşturun.
  2. Hesap ayarlarınızda bir API belirteci oluşturun.
  3. Paketinizi twine kullanarak 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.

Share: