Merhaba bu yazıda Python ile yazdığımız paketlerin PyPi üzerinde nasıl paylaşılacağını anlatacağım. Aslında rivayet odur ki ben bu yazıyı yazmışım. Yaklaşık 4 yıl önce. Ama tekrar yazmanın zararı yok.
Kevser Sırça şöyle bir tweet atmıştı
https://twitter.com/kevsersrca/status/920716435852230656
PyPi Nedir?
İşin fransızlarına gem, npm, nuget, composer dersem anlaşılır olabilir sanırım. Kendi projeleri için python modülleri yazan abiler, bu modülleri başkaları da kullanmalı diyerek PyPi üzerine yüklemeler gerçekleştirirler. Bizler de sonraları bu modülleri kullanırız.
pip install django==1.11
Bash komutu django kurulumunu gerçekleştirecektir. Siz de benim atomu parçalayan modülümün herkesçe kullanılmasını isteyenlerdenim diyorsanız bu yazı tam size göre.
Başlamadan Önce
https://pypi.python.org/pypi adresinden (yeni sekmede açın) bir hesap oluşturalım. Burada kullanacağınız parola büyüklü küçüklü harf ve rakam içeren türden olmalı. PGP alanı için bir zorunluluk bulunmamakta.
Aynı kayıt işlemini Test sitesi için de gerçekleştirelim. Bu Python modülleri için test adresidir. https://testpypi.python.org/pypi. Aslında bu çok önemli değil ama buraya kayıt olun siz.
Kayıt olurken aynı kullanıcı adı ve parola ile kayıt olmanız neydi lan benim hesap bilgileri gibi sorular sormanıza da engel olacaktır.
Bu test üyeliğini biraz sonra göreceğimiz ayar dosyasında belirtebiliriz.
.pypirc
Python modüllerini yukarıya atarken yetkilendirme işlemlerini sağlayacağımız pypirc dosyasını nano yardımıyla oluşturalım.
nano ~/.pypirc
Örnek bir .pypirc dosyası şöyle olmalı
[distutils] index-servers = pypi testpypi [pypi] repository=repository=https://upload.pypi.org/legacy/ username=KULLANICI_ADINIZ password=ÇOKTA_GİZLİ_OLMAYAN_PAROLANIZ [testpypi] repository=https://test.pypi.org/legacy/ username=KULLANICI_ADINIZ password=ÇOKTA_GİZLİ_OLMAYAN_PAROLANIZ
CTRL + x ve Y yaparak dosyayı kaydedin. Dikkat ettiyseniz eğer test ve gerçek depo adresi için kullanıcı adı ve parola bilgileri ayrı ayrı veriliyor.
Proje Yapısı
Proje adını say_hello olarak verdiğimizi varsayalım. Bu projenin yapısı şöyle olmalıdır:
say_hello/
setup.py
setup.cfg
LICENSE.txt
README.md
paketimiz/
__init__.py
hello.py
merhaba.py
Burada yer alan hello.py ve merhaba.py projenizde yer alan dosyalar olacaktır. Bu adımdan sonra setup.py dosyasını oluşturmalıyız. Bu dosya projenin temel bilgilerini saklıyor olacak. Kısacası metadata diyebiliriz.
setup.py Dosyası
Bu dosya için distutils modülünü import etmeliyiz.
from distutils.core import setup
Genel olarak kodları vereyim ve açıklamasını yapayım:
setup( name = 'paketimiz', packages = ['paketimiz'], version = '0.1', description = 'Sağa sola selam veren garip bir uygulama', author = 'Ali GÖREN', author_email = '[email protected]', url = 'https://github.com/aligoren/paketimiz', download_url = 'https://github.com/aligoren/paketimiz/archive/ilk.tar.gz', keywords = ['selam', 'naber', 'bilmemki'], classifiers = [], )
Packages kısmında yer alan değer, name değeriyle aynı olmalı. Diğer kısımlar açıkcası çok zorlayıcı değil. Proje url’i için github vermek zorunlu değil. Ancak çoğu kişi bu adresi veriyor. İsterseniz download_url kısmına kendi sitenizin adresini de verebilirsiniz. Ayrıca paket için gerekli keywordleri mantıklı bir şekilde seçmeniz, erişilebilir olmasına imkan tanıyacaktır.
setup.cfg
Asıl metadata bilgisinin yani proje açıklama bilgisinin girileceği (markdown olabilir, rst olabilir) yer burası. Direkt bir açıklama girmek yerine oluşturduğumuz readme dosyasını kullanabiliriz:
[metadata] description-file=README.md
Her şey tamam ise şu komutu çalıştırıp öncelikle dist klasörümüzü oluşturalım. python setup.py sdist Bu komut oluşturduğumuz projeyi arşiv dosyası halinde dist klasörü altına oluşturacaktır.
Örneğin paket adımız mehmet olsun. Bunun oluşan arşiv dosyası adı mehmet-VERSIYON.tar.gz şeklinde olacaktır.
twine Kurulumu
Her şey hazır, şimdi twine kurulumuna geçelim. Python dokümantasyonlarında da kullanılan twine ile paketlerimizi yukarıya atılabilir hale getiriyoruz. Bu paketleri hem PyPi live hem de PyPi test üzerine yollayabiliriz yani.
sudo pip install twine
Bu komutla twine kurulumunu yapalım ve sonraki adıma geçelim.
Test Sitesi Üzerinde Kontrol
Yazının başından da hatırlayacağınız gibi hem test hem de live için kayıt olduk. Bu paketi öncelikle test üzerinde kontrol edelim.
twine register dist/ARSIV_DOSYAMIZ.tar.gz -r testpypi
Eğer HTTPError: 410 Client Error: Project pre-registration is no longer required or supported, so continue directly to uploading files. hatası alırsanız
twine upload dist/ARSIV_DOSYAMIZ.tar.gz -r testpypi
komutunu kullanarak yukarıya direkt gönderebilirsiniz. TestPyPi sitesinde sağ tarafa bakarsak yayınladığımız paket oralarda boş boş durmakta.
Burada yer alan -r flag ise hangi repository üzerinde paketin gönderileceğini belirtiyor. Kısacası şu an hala test modülünde çalışıyoruz. Bunu live PyPi üzerine atalım.
Bunun için direkt olarak upload komutunu kullanalım ve dist altında yer alan tüm dosyaları belirtelim. Zorunlu değil. Eğer isterseniz tek bir dosyayı da seçebilirsiniz.
twine upload dist/paketimiz-0.1.tar.gz Uploading distributions to https://upload.pypi.org/legacy/ Uploading paketimiz-0.1.tar.gz
Dosyamız yüklendikten sonra gerçekten live üzerinde yer alıyor mu kontrol etmeliyiz. Basitçe paketimizi kuralum pip install paketimiz
Ardından ben Python3 ile deniyorum
>>> from paketimiz import hello >>> hello.msg() Hello world