Mengelola Dependensi Proyek Python

Ternyata Mengelola Dependensi Proyek Python Semudah Ini, lo!

Hai, Coders! 👋 Apakah kamu seorang Python Developer yang ingin mengelola dependensi proyek dengan lebih mudah? Kalau iya, kamu berada di artikel yang tepat! Melalui artikel ini, kita akan bahas tuntas cara proyek Python bisa terbebas dari masalah dependensi dan terkelola dengan rapi. Yuk, langsung saja kita mulai pembahasannya!

Mengelola Dependensi dalam Proyek Python

Tahukah kamu bahwa dependensi yang kita gunakan dalam proyek Python dicatat dalam berkas requirements.txt. Mengapa berkas ini penting? Supaya siapa pun yang mau menjalankan suatu proyeknya kembali, cukup menginstal dependensi yang tertera dalam berkas tersebut.

Bayangkan kamu memiliki proyek yang tidak dikelola selama berbulan-bulan. Namun, kebutuhan menuntutmu untuk menjalankan proyek itu kembali. Sayangnya, kamu lupa untuk mencatat package dan dependensi yang telah digunakan sebelumnya. Alhasil, kamu mencoba untuk menjalankannya dengan versi dependensi yang kamu miliki saat ini. 

💻 Mulai Belajar Pemrograman

Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.

Daftar Sekarang

Kamu cukup beruntung jika proyek tersebut masih bisa berjalan sebagaimana mestinya. Jika tidak, error karena konflik dependensi akan terjadi. Kasus seperti ini menjadi pengingat untuk kita akan pentingnya selalu mencatat package dan dependensi yang digunakan dalam suatu proyek secara spesifik.

Lantas, bagaimana cara mengelola dependensi proyek dengan mudah? Mari kita bahas langkahnya satu per satu.

Mulai dengan Membuat Virtual Environment

Untuk mengelola dependensi proyek Python, langkah pertama yang wajib dilakukan adalah membuat virtual environment. Apa itu virtual environment? Virtual environment adalah lingkungan terisolasi yang memungkinkan kita menginstal dependensi tanpa memengaruhi sistem Python utama di komputer kita. Ini sangat membantu untuk menghindari konflik antara proyek yang berbeda.

Ada beberapa tools sederhana yang bisa kamu gunakan untuk membuat virtual environment dengan Python, antara lain:

  • Menggunakan virtualenv
    Merupakan package yang dirancang khusus untuk membuat virtual environment terisolasi di dalam Python. Cara penggunaannya adalah seperti berikut:

  • Menggunakan venv
    Merupakan versi subset dari virtualenv sehingga venv memiliki beberapa keterbatasan, yaitu lebih lambat pembuatannya, tidak dapat diperbarui dengan pip, dan lain sebagainya. Untuk lebih lengkapnya dapat kamu simak pada dokumentasi berikut.

    Package
    ini sudah tersedia sebagai bawaan sejak Python versi 3.3, sehingga tidak memerlukan instalasi package tambahan. Cara penggunaannya adalah seperti berikut:

  • Menggunakan pipenv
    Merupakan package untuk mengelola environment dan dependensi proyek Python dengan lebih mudah dan modern. Package ini akan menggunakan berkas yang bernama Pipfile dan Pipfile.lock ketika menginstal dependensi, layaknya package.json dan package-lock.json pada environment Node.js. Cara penggunaannya adalah seperti berikut:

Mencatat Dependensi yang Digunakan

Anggap saja kita sudah membuat virtual environment dan menyelesaikan proyek di dalamnya secara terisolasi. Selanjutnya adalah mencatat seluruh package dan dependensi yang digunakan ke dalam berkas yang bernama requirements.txt. Langkah yang paling umum dan sering orang gunakan untuk menghasilkan berkas tersebut adalah dengan perintah berikut.

Catatan: Perintah ini akan mencantumkan semua package dan dependensi yang terinstal pada environment.

Dari penjelasan singkat di atas, kamu mungkin mulai bertanya, apakah langkah tersebut terbilang efektif? Hm, mari kita bahas!

Dilemanya Penggunaan Pip Freeze

Ketika kita menginstal suatu package, package lain yang menjadi dependensinya akan ikut terinstal. Misalnya, ketika kita menginstal package pandas dengan versi 2.2.2, akan muncul output seperti berikut.

Menginstal pandas versi 2.2.2
Yup
, tidak hanya package pandas saja yang terinstal, melainkan juga package yang menjadi dependensinya seperti numpy, python-dateutil, hingga tzdata. Ketika kita menjalankan perintah  , dihasilkan output seperti berikut.

Output pip freeze

Oke, nampaknya masih baik-baik saja. Itu karena kita menginstal seluruh package tersebut di dalam sebuah virtual environment. Bayangkan jika kita melewatkan langkah tersebut, hasil output yang tampil kemungkinan berisikan beberapa package yang tidak relevan dengan proyek yang dikerjakan sekarang. Hal ini terjadi karena pip freeze akan selalu mengambil package yang berada dalam environment-nya. Akibat tidak ditemukannya environment yang terisolasi maka ia akan mengambil seluruh package yang berada dalam environment global yang kita miliki.

pip freeze juga hanya mendeteksi seluruh package yang terinstal dengan perintah  . Jadi, ia tidak akan mendeteksi package yang diinstal menggunakan package installer lainnya, seperti poetry, setuptools, conda, dan lain sebagainya.

Tidak hanya itu, masih ada masalah lain yang mungkin saja terjadi. Mari ambil contoh penginstalan package pandas==2.2.2 sebelumnya. Jika sewaktu-waktu terjadi deprecated pada salah satu method yang dimiliki atau ada pengoptimalan dari package tersebut yang menuntut kita untuk segera memperbarui versinya, bisa jadi terdapat perubahan dependensi di dalamnya. 

Seperti sebelumnya, ia akan tetap secara otomatis menginstal seluruh dependensi yang diperlukan. Hanya saja, bagaimana dengan dependensi sebelumnya yang sudah tidak terpakai? Kita memang bisa menghapusnya secara manual supaya tidak tercatat ketika menggunakan perintah pip freeze. Untuk proyek skala kecil mungkin masih terbilang minim effort untuk menghapusnya satu per satu, tetapi bisa dibayangkan jika proyek yang dikerjakan berada di skala menengah ke atas, misalnya memiliki lebih dari 20 package. Itupun kalau kita menyadari apa saja daftar package yang sudah tidak relevan untuk dihapus.

Catatan: Penggunaan perintah   dengan pipenv sebagai virtual environment bisa membantu mencatat seluruh package yang digunakan berdasarkan berkas Pipfile.lock. Hanya saja, hasil yang tercatat hampir serupa dengan penggunaan pip freeze.

Dari permasalahan di atas, kita dapat menyadari bahwa penggunaan pip freeze dalam mengelola dependensi proyek dapat dikatakan kurang baik. Oleh karena itu, bagaimana jika kita mencatatnya secara manual? Tentu hal tersebut membutuhkan effort waktu yang tidak sedikit. Jadi, kita akan mencoba alternatif yang lebih baik.

Penggunaan Package Pipreqs

Kita akan mencoba menggunakan sebuah package yang bernama pipreqs. Package ini bekerja hanya dengan mencatat package yang digunakan dalam kode proyek, jadi tolak ukurnya adalah mencatat package apa saja yang diimpor pada proyek. Dengan demikian, ia tidak akan mencatat dependensi dari package-package tersebut.

Dengan menggunakan package pipreqs, kita sudah berhasil mengatasi permasalahan yang mungkin terjadi ketika menggunakan pip freeze. Lalu, bagaimana cara menggunakannya? Sangat mudah, kamu bisa mengikuti opsi-opsi yang tertera pada dokumentasi resminya, atau memahami rangkuman perintah berikut.


Ingatlah bahwa rangkuman perintah di atas hanya sebagai gambaran saja, kamu bisa memadukan beberapa opsi sekaligus bersamaan dengan penggunaan path. Silakan disesuaikan dengan kebutuhan proyek masing-masing.

Walaupun mudah untuk digunakan, ternyata masih ada beberapa bug yang mungkin akan sering dijumpai dalam penggunaannya. Berikut beberapa bug dan solusi penanganannya.

  • Gagal mendeteksi versi package yang terinstal secara lokal.
    Salah satu bug yang sering dijumpai adalah kegagalan package ini dalam mendeteksi versi package yang terinstal secara lokal. Hal ini dianggap sebagai bug karena kegagalan yang terjadi hanya dialami sebagian package saja. Alhasil, ia akan mencatat versi package yang gagal terdeteksi dengan versi terbaru yang tersedia dari situs pypi.

    Bug ini ditandai dengan kemunculan informasi “Warning” sebagaimana yang tertera pada output di bawah. Solusi yang dapat kita lakukan sebenarnya juga sudah tertera pada output, yaitu dengan mengecek versi package yang gagal terdeteksi secara manual, menggunakan perintah  .

    Error Mendeteksi Versi Package
  • Data package tercatat secara berulang (terduplikasi).
    Sebenarnya bug ini hampir selalu terkait dengan bug sebelumnya. Selain berpeluang gagal mendeteksi versi package yang terinstal secara lokal, ia juga berpeluang gagal dalam mendeteksi package yang sudah tercatat sebelumnya. Alhasil, terdapat kemungkinan package yang tercatat secara berulang.

    Seperti yang dapat dilihat pada output di bawah, terdapat package yang tercatat secara berulang yaitu Pillow. Solusi yang dapat kita lakukan sebenarnya mirip dengan kasus sebelumnya, yaitu dengan mengecek versi package menggunakan perintah  . Kemudian hapus package dengan versi yang tidak sesuai dengan hasil perintah tersebut.
    Terdapat duplikasi package

  • Error “UnicodeDecodeError” ketika menggunakan virtualenv/venv.
    Error “UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xb1” bisa terjadi ketika kita menggunakan virtual environment dengan virtualenv/venv. Hal ini karena package pipreqs mencoba mencatat dependensi yang digunakan dalam direktori environment, tetapi gagal dalam memahami berkas-berkas di dalamnya.

    Error ini cukup diatasi dengan mengabaikan direktori environment, mengingat penggunaan direktori tersebut juga tidak memiliki kaitan apa pun dengan berkas requirements.txt. Caranya adalah dengan menambahkan opsi   ketika menjalankan package tersebut. Hal ini sudah dicontohkan pada rangkuman perintah  
     sebelumnya.

Itulah beberapa bug yang mungkin akan sering kita jumpai dalam penggunaannya. Jika kamu menemukan bug dan solusi lainnya, boleh banget sharing di kolom komentar yah~

Penggunaan Pipreqs dalam Proyek Google Colab

Oke, sekarang kita sudah mengetahui pentingnya untuk selalu menggunakan virtual environment sebagai langkah awal pengerjaan proyek. Kita juga sudah mengetahui kelebihan dari pengelolaan dependensi proyek dengan menggunakan package pipreqs. Sekarang mungkin muncul pertanyaan baru, bagaimana cara menggunakannya dalam proyek Google Colab?

Pertanyaan yang menarik, mari kita bahas!

Awalnya, mungkin kamu berpikir untuk mengunduh proyek Google Colab yang sudah selesai dikerjakan, lalu menjalankan pipreqs secara lokal pada proyek yang diunduh tersebut. Cara ini memang masuk akal, tetapi bukan merupakan praktik yang baik. Sebab, tidak ada jaminan bahwa versi package dan dependensi yang digunakan dalam Google Colab akan sama dengan yang kamu gunakan secara lokal. Ingatlah bahwa sedikit saja perbedaan bisa menyebabkan konflik dependensi.

Jadi, daripada harus melakukan pendekatan seperti itu, lebih baik berfokus untuk mencatat seluruh package yang digunakan langsung melalui proyek Google Colab. 

Untuk mengawalinya, bukalah salah satu proyek Google Colab yang sudah dikerjakan. Kemudian tambahkan satu sel kode di posisi teratas. 

Catatan: Sel kode ini bersifat sementara, hanya ditambahkan dan digunakan untuk keperluan pencatatan package yang digunakan saja. Ketika sudah selesai, kamu bebas untuk menghapusnya. Posisinya pun sebenarnya dibebaskan.

Selanjutnya, kita bisa mulai dengan menginstal package pipreqs terlebih dahulu.

Catatan: Tanda  digunakan untuk mengeksekusi perintah shell atau command line dari dalam sel kode.

Untuk menggunakan package tersebut, kita perlu mengatur path-nya sesuai dengan lokasi proyek yang bersangkutan. Di manakah lokasi proyek Google Colab? Umumnya berada dalam Drive kita, tepatnya dalam direktori “Colab Notebooks”. Untuk bisa mengaksesnya, kita perlu menjalankan kode berikut.


Setelah menjalankan kode tersebut, kamu perlu memilih akun Google yang kamu gunakan dalam pengerjaan proyek dengan Google Colab dan mengizinkan seluruh aksesnya. Setelah berhasil, akan muncul akses ke direktori Drive pada sidebar dari Google Colab yang nampak seperti gambar berikut.

Akses ke Drive melalui sidebar dari Google Colab

Kamu bisa membuka hirarkinya dan memastikan bahwa proyek tersebut berada di dalamnya.

Memastikan proyek yang dikerjakan berada di Drive

Setelah memastikan proyek Google Colab tersebut berada dalam Drive, kita bisa memisahkannya dengan proyek lain (jika memiliki lebih dari 1 proyek). Tujuannya, tentu supaya pencatatan yang dilakukan spesifik kepada proyek yang sedang dikerjakan saja. Sebagai contoh mari kita buat direktori bernama “Demo” dan memindahkan proyek yang sedang dikerjakan ke dalamnya.

Memindahkan proyek supaya pencatatan bisa spesifik

Terakhir kita cukup “Copy path” dari berkas yang bersangkutan dan menggunakan nilai path tersebut ke dalam implementasi pipreqs. Ingat, kamu bebas mengombinasikan opsi apa pun sesuai dengan kebutuhanmu.


Perintah di atas akan menghasilkan berkas requirements.txt sesuai dengan path yang tertera.

requirements.txt sudah berhasil dibuat

Kesimpulan

Mengelola dependensi proyek Python memang bisa menjadi tantangan tersendiri, terutama jika kita tidak menggunakan pendekatan yang tepat. Dengan menggunakan virtual environment dan package pipreqs, proses ini menjadi jauh lebih mudah dan terstruktur. Ingatlah untuk selalu mencatat dependensi yang digunakan agar proyekmu mudah dikelola dan dijalankan kembali di masa mendatang.

Meme Pip Freeze & Pipreqs

Semoga artikel ini membantu kamu dalam mengelola dependensi proyek Python dengan lebih baik. Jika ada pertanyaan atau pengalaman yang ingin dibagikan, jangan ragu untuk meninggalkan komentar di bawah. Selamat mencoba, Coders! 🚀


Belajar Pemrograman Gratis
Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.