Pipenv nedir ve nasıl kullanılır?
Bilgisayarınızda 2 adet Python tabanlı proje geliştirmeye çalıştığınızı hayal edin. Bir tanesi Python 2 diğeri ise Python 3 ile çalışmaktadır. Haliyle Python 2 ile çalışanın ve Python 3 ile çalışanın eklentileride farklı olacaktır. Python 3 içerisinde Python 2 ile yazılmış kodları çalıştırmayacağız. O zaman ne yapmamız lazım? Bu iki projenin bağımlılıklarını birbirinden izole etmemiz lazım. İşte tam olarak bu noktada Pipenv bizim yardımımıza koşuyor. Bir bilgisayar içerisinde ayrı ayrı izole proje ortamları yaratabilmemize olanak sağlıyor. Bu sayede ayrı projelerimize ayrı paketler yükleyebiliyoruz ve paket çakışmalarından tamamen kurtuluyoruz.
Kısa bir özet geçmek istersek. Pip paket yönetim sistemi ve virtualenvtı birleştirip, tek bir alanda bunları yönetebildiğimiz harika bir paket!
Öncelikle bilgisayarımıza pipenv yüklememiz gerekmektedir bunun için aşağıda ki kodu çalıştıralım.
pip3 install pipenv
Pipenv Aktifleştirme
Bilgisayarımızda artık pipenv yüklü olduğuna göre hemen bunu aktifleştirelim. Aşağıda ki komut sayesinde virtual(sanal) alanımız oluşmuş olacaktır. Sanal alanınızın aktif olduğunu terminal ekranınızın solunda görebilirsiniz. Otomatik olarak komut yazdığınız satırın. En solunda () parantezler içinde bir isim yazacaktır. Bu sizin sanal ortamızın adı olacaktır.
pipenv shell
Bu komutu çalıştırdıktan sonra, komutu çalıştırdığınız dizinde bir Pipfile dosyası oluşacaktır. Bu dosya bizim için hayati önem taşır. Çünkü bağımlılıklarımızı bu dosya içerisinden yöneteceğiz. Dosyaya çift tıklayıp içerisinde girdiğinizde, karşımıza [[source]], [dev-packages], [packages] ve son olarak [requires] adında bölümler gelecektir. Birazdan bu izole ortama paket yüklediğimde bu alanlardan packages kısmının dolmaya başladığını göreceksiniz.
Sanal Ortamdan Çıkma
Sanal ortamın aktif olduğundan emin olduktan sonra. (Sol tarafta komut satırında () parantezler içinde isim yazdığından emin olun.). Çıkış işlemi gerçekteştirelim. Aşağıda ki komutu yazdıktan sonra, sol tarafta ki yazının yok olduğunu ve artık sanal ortamın aktif olmadığı göreceksiniz.
exit()
Sanal Ortama Girmeden Python’ı Çalıştırma
Paket yüklemeye geçmeden ufak bir özellik gösterelim. Pipfile dosyasının bulunduğu dizinde olduğunuzdan emin olduktan sonra, aşağıda yazmış olduğum komutu çalıştıralım. Bu komut sayesinde sanal ortamı daha aktif bile etmeden, sanal ortamın içindeki python versiyonunu kullanabildik.
pipenv run python
Paket Yükleme
Harika! Sanal ortamımız oluştuğuna göre bu sanal ortam ile çalışacak uygulamanın bağımlıklıklarını yüklemenin zamanıda geldi. Örneğin bu sanal ortamımızda django ile çalışaksak. Aşağıdaki komut sayesinde sistemimize django paketi yüklenecektir.
NOT: Aşağıdaki komut, pipenv shell ile izole ortam aktif edildikten sonra yada bulunduğunuz dizinde Pipfile dosyası varken izole ortam aktif edilmeden de çalışabilmektedir.
pipenv install django==3.0.1
Yukarıda ki komut tamamlandıktan sonra neler oldu bir inceleyelim.
1- Otomatik olarak Django paketi Pipfile dosyamızın içerisine eklendi ve uygun versiyonda yanına yazıldı.
2- Bir tane .lock dosyası oluşturuldu. (Üzerinde daha sonra durulacaktır.)
İşlemler tamamlandı.
Pipfile sayesinde artık projemizde hangi bağımlılıklar var ve hangi versiyon ile proje içerisinde kullanılıyorlar bir yerde tutabiliyoruz. Yarın birgün ekibe gelen bir kişiye bu dosyayı ve lock dosyasını vererek bütün bizim sahip olduğumuz bağımlılıkları kurabilmesini sağlayacağız.
Lock Dosyası
İlk bu dosya oluşturulduğunda içine girin gözümüze biraz korkunç gelebilir. Yaptığı işler ise harika!
Temel olarak bizim bütün bağımlılıklarımız ve bu bağımlılıklarımızın bütün bağımlılıkları burada versiyonları ile birlikte tutuluyor. Bu sayede deploy ederken her şeyin aynı versiyonunu kullanabileceğiz. Bu dosyaya dokunmamalıyız. Bu dosya bir her paket yüklediğimizde otomatik olarak kendisi tarafından düzenlenecektir. Bu sayede bir paketin en son sürümünü yüklediğinizde arka tarafta bir şeyler güncellendiyse vb senaryolarda problemler yaşamayacaksınız.
Bağımlılıkları Listeleme
Pipfile dosyasının içerisine girerek hangi bağımlılıklara sahibiz evet biliyoruz ama bunu kod ile yapmak istersek? Aşağıdaki kod terminal ekranında sizlere bir liste verecektir. Bu liste izole ortamda sizlerin sahip olduğu bağımlılıkları döndürecektir.
pipenv lock -r
Paket Silme
Bir paketi yükledikten sonra o paketi silmek isteyebiliriz.
pipenv uninstall django
Bazı paketler vardır bunlar sadece geliştirme ortamı içindir. Bu tarz paketlere biz dev packages diyoruz. Sadece development ortamında gerekli olan paketlerdir. Bu paketlerin production ortamında olmasını istemeyiz. Tek yapmamız gerek pipenv yükleme komutunun sağ kısmına — dev eklemek olacaktır. Bu sayede pipfile içerisinde [packages] kısmına eklenmek yerine bağımlılığımız [dev-packages] kısmına eklenecektir.
pipenv install nose --dev
Requirements.txt Dosyasından Paket Yüklemek
Requirements.txt dosyasında biz bilindiği üzere paketler ve bu paketlerin sahip olduğu versiyonları düz yazı şeklinde alt alta satırlar halinde tutuyorduk. Elimizde bu dosya varsa ve bu dosyayı pipenv ile birleştirmek ve buradan devam etmek istiyorsak artık yapmamız gereken çok basit. Aşağıda ki komutu çalıştıracağız ve otomatik olarak requirements.txt dosyası içerisinde ki paketler pipfile içerisine eklenecektir. Requirements.txt yolunu doğru yazmaya özen gösterelim. Bu işlemler sonucunda lock fileda güncellenmiş olacaktır.
pipenv install -r ./requirements.txt
Güvenlik Açığı (security vulnerability)
pipenv check
Bu otomatik olarak bütün paketlerimizi taratacak ve bir problem olduğunda bunu bize bildirecektir. Örneğin kullandığımız paketin içerisinde bir güvenlik açığı varsa bunun ile ilgili bize uyarıda bulunup şu versiyona geçirin şeklinde uyarılarda bulunacaktır. Güvenlik açıklıklarını gidermek için ise tek yapmamız gereken şey.
pipenv install
Bu sayede otomatik olarak pipenv bizim için paketleri güncelleyecektir. Haliyle lock dosyasıda güncellenecektir.
Bağımlılık Ağacı
Diğer adıyla graph da diye biliriz. Bağımlılık ağacı olarak çevirdiğim dependency tree sayesinde bağımlılıklarımı ve bu bağımlılıkların bağımlılıklarını tek bir yerden görüntüleyebilirim.
pipenv graph
Deployment Zamanı!
Pipfile’ı biz genel olarak development için kullanıyoruz. Örneğin bir paket yüklediğimizi düşünelim. pipenv install django yaptık. Pipfile içerisine baktığımızda django = “*” şeklinde eklenmiş olacağını göreceksiniz. Bu aslında bizim pek isteyeceğimiz bir şey değildir. Şöyle açıklık getireyim. Bu yıldız sembolü en son güncel paketi yükleyecektir. Belki de projeyi yazarken kullandığımız zamanda ki, en güncel versiyonda ki şeylerin yeni versiyonda kaldırılması demektir. Lock file sayesinde her şeyin o an versiyonları ve bağımlılıklarında versiyonları tutulduğu için * gibi belirsiz şeyler yerine aslında lock file içerisinde tam yerli yerinde sayıları ile belirlenmiş ve hatta birbirine bağımlı çalışan versiyonları tutuyoruz. Uzun lafın kısası projeyi yazarken enson hangi versiyon kullanıldıysa ve bu paketin bağımlılıklarının hangi versiyonları kullanıldıysa bunlar lock dosyasında açık ve net ifade edildiğinden daha rasyonel bir yapı olmuş oluyor. Yani Lock dosyası sayesinde çok daha tutarlı oluyoruz. Buda bize deploymentda sorun çıkmasına engel olacaktır. Karışık oldu gibi hissediyorum ama umarım olmamıştır. Deployment yapmadan önce o zaman ne yapmamız lazım lock dosyasını bir güncel değilse güncelleyelim, yoksa oluşturalım. Komut aşağıdadır.
pipenv lock
Sunucuya .lock dosyasını attıktan sonra yazmamız gerek komut ise.
pipenv install --ignore-pipfile
Bu sayede bütün bağımlılıkları pipfile.lock dosyası üzerinden yüklemiş olacağız.
Bu yazınında sonuna geldik. Umarım Allah ömür verir ve daha güzel yazılar ile karşınızda olurum. Sağlıkla güzellikle kalın.
Oğuzhan ÇELİKARSLAN