Yüzen Bağımlılıkların Kaosu
Python ekosisteminde, "benim makinemde çalışıyor" ifadesi, bağımlılık yönetimi hatalarının ünlü bir belirtisidir.
>=1.0 gibi sürüm belirtilmemiş kısıtlamalara güvendiğinizde, ortamınız yukarı akış paket güncellemelerinin keyfine tabi olur. Geçerli bir bağımlılıkta yapılan küçük bir sürüm artışı, kırılmalara neden olan değişiklikler getirebilir ve bu da yerel ortamda kopyalanması imkansız olan, gizemli hatalara yol açabilir. "Bağımlılık Cehennemi" olarak bilinen bu olgu, profesyonel yazılım mühendisliğinde tekrarlanabilirliğin temel taşı olmasının başlıca nedenidir.
Bu soruna karşı, endüstri standardı artık kilit dosyalarına (lock files) doğru kaymıştır; yani çözülmüş tüm bağımlılıkların statik görüntülerine.
pip gibi araçlar uzun süredir yerel kilit dosyası desteğinden yoksun olsa da, topluluk sağlam çözümler geliştirmiştir. Deterministik (belirli) derlemeler elde etmek için en güçlü iki araç Poetry ve pip-tools (özellikle
pip-compile)'dir. Bu kılavuz, her ikisini de kullanarak kurşun geçirmez, tekrarlanabilir Python ortamları oluşturmanın nasıl yapılacağını inceler.
Strateji A: Poetry'nin Entegre Ekosistemi
Poetry, bağımlılık yönetimini bir düşünce ürünü olarak değil, temel bir özellik olarak ele alır. Bağımlılık çözümlemesini, sanal ortam yönetimini ve paketlemeyi tek bir araçta birleştirir. Bu sistemin kalbi
poetry.lock dosyasıdır.
poetry install komutunu çalıştırdığınızda, Poetry sadece
pyproject.toml dosyasında listelenen paketleri yüklemez; her bir geçerli bağımlılığın tam bir sürüm karmasına sabitlenmesini sağlamak için kilit dosyasını okur. Bu, dizüstü bilgisayarınızdaki ortamın CI/CD ve üretim ortamındakiyle birebir aynı olmasını sağlar.
Temel bir Poetry projesini nasıl kuracağınız aşağıdadır:
# Yeni bir proje başlat
poetry new my-project
# Bir bağımlılık ekle
poetry add requests
# Bu, requests ve tüm alt bağımlılıklarını sabitleyen poetry.lock dosyasını oluşturur
Üretimde bağımlılıkları yüklerken her zaman kilit dosyasını kullanın. Üretim hattında asla
poetry update çalıştırmayın; bu, kilit dosyasını potansiyel olarak daha yeni sürümlerle yeniden oluşturacaktır.
# Kilit dosyasından sıkı yükleme
poetry install --no-dev
Poetry'nin avantajı, sorunsuz entegrasyonudur. Ancak standart
pip iş akışlarına bağlıysanız veya derleme zamanı ile çalışma zamanı bağımlılıkları arasında sıkı bir ayrım gerekiyorsa, Poetry'nin her şeyi bir arada sunan yaklaşımı çok monolitik gelebilir.
Strateji B: pip-tools Yaklaşımı
Basitliği tercih eden geliştiriciler için
pip ama deterministik derlemeler gerekiyorsa,
pip-tools ideal bir çözümdür.
pip-compile aracı, doğrudan bağımlılıklarınızı listeleyen bir
requirements.in dosyasını alır ve tam sürüm sabitleme ile bir
requirements.txt dosyasına çözümleyerek dönüştürür.
Bu yöntem, Go modülleri veya Cargo'nun davranışını taklit eder; amaç (ne istediğinizi) ile uygulama (ne aldığınızı) arasında net bir ayrım sağlar.
# Bir requirements.in dosyası oluşturun
echo "requests==2.28.0" > requirements.in
# Bağımlılıkları çözümleyin ve derleyin
pip-compile requirements.in
# Bu, tamamen sabitlenmiş bir requirements.txt oluşturur
Oluşturulan
requirements.txt dosyası şöyle görünecektir:
#
# Bu dosya python 3.10 ile pip-compile tarafından otomatik olarak oluşturulmuştur
# Güncellemek için şunu çalıştırın:
#
# pip-compile requirements.in
#
certifi==22.12.7
charset-normalizer==2.1.1
idna==3.4
requests==2.28.0
urllib3==1.26.13
requests'in
certifi,
urllib3 vb. belirli sürümlerini nasıl çağırdığına dikkat edin. Bu dosya, deposuna eklemek ve
pip install -r requirements.txt kullanarak üretimde yüklemek için güvenlidir.
Doğru Aracı Seçmek
Her iki araç da aynı temel sorunu çözer: tekrarlanabilirlik. Poetry, yeşil alan projeler veya paketleri oluşturma ve yayınlama için birleşik bir iş akışı arayan ekipler için daha uygundur. Sanal ortamları otomatik olarak yönetir ve komut dosyaları ile eklentileri yönetmek için zengin bir CLI sunar.
Öte yandan, pip-tools daha hafiftir ve zaten
pip kullanan mevcut Dockerfile'lar ve CI/CD hatlarıyla sorunsuz entegre olur. Ayrıca, Poetry'nin çözümleyicisinin bazen zorlandığı C-uzantıları gibi karmaşık derleme bağımlılıklarına sahip projeler için de tercih edilir.
Sonuç
Bağımlılık cehennemi artık üretim istikrarsızlığı için bir bahane olmamalıdır. İster Poetry'nin
poetry.lock dosyasını, ister pip-tools'un
requirements.txt dosyasını benimseyerek, yazılımınızın tüm ortamlarda tutarlı davrandığını garanti altına alırsınız. Alınacak temel ders basittir: asla yüzen bir sürüm kısıtlamasına güvenmeyin. Bağımlılıklarınızı sabitleyin, kilit dosyalarınıza güvenin ve gecenin bir yarını huzur içinde uyuyun.