Software Development

Şiir gibi Paketleme Yöneticisi: Poetry!

June 14, 2022

Herkese merhabalar,

2018 yılında duyurulan, günümüzde de kullanımı artmaya devam eden, alışık olduğumuz virtualenv/pipenv yapısının dışında daha kapsamlı ve komplike bir yapı sunan paketleme yöneticisi ile sizleri tanıştırmak istiyorum, Poetry…

Çok kısa bir özet geçmek gerekirse, Poetry 2018 yılında 0.1 sürümüyle dünyamıza katılmış, pipenv, virtualenv gibi teknolojilerin üstüne geliştirme yaparken yaşanan birkaç uzun aşamayı da kısaltmayı kendine düstur edinmiş bir paket yöneticisi.

Neden Poetry?

  • Poetry diğer paket yöneticilerinin ötesinde, tek yaml dosyası içerisinde development-test-prod gibi farklı paketleri yüklemenize imkan tanır.
  • Spesifik python versiyonu ve eklediğiniz bağımlılıkları ayrı dosyalar halinde tutarak, bağımlılıkları da ayrıca versiyon bazlı yönetmenize imkan tanır.
  • Kullanım kolaylığı sağlar.
  • Oluşturduğunuz bir paketi kolayca PyPI’ye publish etmenize imkan tanır.
  • Önbellek tutarak, tekrar tekrar paket indirip zaman/bant genişliği kaybını önler.

Poetry Sisteme Yükleme

Bu kadar övdükten sonra nasıl kullanacağımızı anlatmaya başlayabilirim

Kurulum adımı gayet basit,
Linux/MacOSX için;

curl -sSL https://install.python-poetry.org | python3 -

PowerShell kullanarak yüklemek için (windows);

(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

Kurulum işlemi tamamlandıktan sonra kontrol etmek için;

sezerb@optimist~> poetry --version
Poetry version 1.1.13

Poetry Autocomplete özelliğini Aktif Etme ve Silme

Eğer konsol olarak standart bash ya da cmd yerine, zsh, fish gibi konsol kullanmayı tercih ediyorsanız şu komutlardan sizin konsolunuz özelinde olanını seçip tek satırda poetry’i sisteme ekleyebilirsiniz;

# Bash
poetry completions bash > /etc/bash_completion.d/poetry# Fish
poetry completions fish > ~/.config/fish/completions/poetry.fish# Zsh
poetry completions zsh > ~/.zfunc/_poetry# Oh-My-Zsh
mkdir $ZSH_CUSTOM/plugins/poetry
poetry completions zsh > $ZSH_CUSTOM/plugins/poetry/_poetry# prezto
poetry completions zsh > ~/.zprezto/modules/completion/external/src/_poetry

Eğer poetry’i silmek isterseniz;

curl -sSL https://install.python-poetry.org | python3 - --uninstall
curl -sSL https://install.python-poetry.org | POETRY_UNINSTALL=1 python3 -

Poetry ile Proje Başlatma ve Yönetme

Projenizi ilk defa oluştururken direkt olarak konsoldan ya da Pycharm yardımıyla Poetry kullanabilirsiniz. Konsoldan;

sezerb@optimist~/working_table> poetry new sample-project
Created package sample_project in sample-project
sezerb@optimist~/working_table> ls
sample-project/
sezerb@optimist~/working_table> cd sample-project/
sezerb@optimist~/w/sample-project> ls
pyproject.toml README.rst sample_project/ tests/
sezerb@optimist~/w/sample-project> ls -al
total 20
drwxrwxr-x 4 sezerb sezerb 4096 Jun 13 06:24 ./
drwxrwxr-x 3 sezerb sezerb 4096 Jun 13 06:24 ../
-rw-rw-r-- 1 sezerb sezerb 300 Jun 13 06:24 pyproject.toml
-rw-rw-r-- 1 sezerb sezerb 0 Jun 13 06:24 README.rst
drwxrwxr-x 2 sezerb sezerb 4096 Jun 13 06:24 sample_project/
drwxrwxr-x 2 sezerb sezerb 4096 Jun 13 06:24 tests/
sezerb@optimist~/w/sample-project> cat README.rst
sezerb@optimist~/w/sample-project> cd tests/
sezerb@optimist~/w/s/tests> ls
__init__.py test_sample_project.py
sezerb@optimist~/w/s/tests> cd ..
sezerb@optimist~/w/sample-project> ls
pyproject.toml README.rst sample_project/ tests/
sezerb@ubuntu2204 ~/w/sample-project> cat pyproject.toml
[tool.poetry]
name = "sample-project"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"][tool.poetry.dependencies]
python = "^3.10"[tool.poetry.dev-dependencies]
pytest = "^5.2"[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

Gördüğünüz gibi tek satır komut ile projenin test kısmı dahil olmak üzere projeyi oluşturup, README dosyası dahil olmak üzere ayağa kaldırıyor. Pycharm ile birlikte kullanmak içinse;

Varolan bir Projeye Poetry ekleme

Projenin olduğu dizine gidip;

poetry init

Paket bağımlılığı ekleme/çıkarma/güncelleme

Projenizi oluşturduktan sonra yeni bir bağımlılık ekleme/güncelleme/silme için;

poetry add [package-name] # yeni bağımlılık ekler
poetry remove [package-name] # varolan bir bağımlılığı siler
poetry update [package-name] # eğer paket adı belirtirseniz eklediğiniz paketi, yazmazsanız tüm paketleri son sürüme günceller

Farklı Python Versiyonları ile Çalışma

Poetry’nin sağladığı bir diğer kolaylıkta farklı python versiyonları ile kodunuzu test edebilmenize imkan tanıması. İsterseniz proje özelinde isterseniz globale farklı versiyonlar yükleyerek kolayca bu python versiyonları arasında gezebilmek mümkün;

pyenv install 3.9.8
pyenv local 3.9.8 # projenizi bu versiyon ile çalıştırmanızı sağlar
poetry install
poetry env use python3.7 # versiyon değişimi
poetry env info # anlık olarak kullandığınız versiyon bilgisi ve detaylarını içerir.

PyPi’ye Paket Gönderme

Normalde bir paket hazırladığınızda bu paketi PyPi’ye yüklemekte ayrı bir süreç gerektirirken Poetry bu zahmetten bizleri kurtarıyor, tek yapmanız gereken;

poetry config repositories.foo-pub https://pypi.example.org/legacy/ # projenizin PyPI adresini ekleme
poetry config http-basic.foo-pub <username> <password> # giriş işlemi
poetry publish --build --repository foo-pub # paketinizin build alıp PyPI'ye gönderme

Sonuç

Eğer tüm paketlerimi tek bir paket yöneticisini üzerinden kontrol edeyim, bu paket yöneticisi aynı zamanda ekstra zengin özelliklere sahip olsun, PyPI’ye de paket atmaktan çekinmeyeyim, built-in olarak farklı python versiyonları ile çalışmak istiyorum, projemin dev/test/prod paket bağımlılıklarını konsoldan yöneteyim ve tek bir yaml içerisinde dursun gibi avantajlardan faydalanayım istiyorsanız Poetry tam sizlik. Eğer hiç denemediyseniz varolan bir projenizi de poetry’e taşıyarak başlayabilirsiniz. Üstelik bunun için tek yapmanız gereken “poetry init” komutu vermek, interaktif olarak bu taşıma işini poetry sizinle beraber yapıyor;

Bir başka yazımda görüşmek üzere…

Author: Sezer Bozkır

Tags

Paketleme Yöneticisi Poetry Python