آموزش استفاده از pre-commit در فریم‌ورک جنگو برای بهبود کیفیت کد

آموزش استفاده از pre-commit در فریم‌ورک جنگو برای بهبود کیفیت کد
آموزش استفاده از pre-commit در فریم‌ورک جنگو برای بهبود کیفیت کد

آموزش استفاده از pre-commit در فریم‌ورک جنگو برای بهبود کیفیت کد

در پروژه‌های جنگو، حفظ کیفیت کد و جلوگیری از ورود خطاهای ساده به مخزن گیت مهم است. بسیاری از این خطاها مانند فرمت‌ نادرست کد، importهای اضافی یا تست‌های ناموفق می‌توانند قبل از کامیت‌ شدن شناسایی شوند. ابزار pre-commit دقیقاً برای همین منظور طراحی شده است.

 

پیشنهاد نویسنده: پروژه سایت دایرکتوری لینک با Python + Django

 

pre-commit چیست؟

pre-commit ابزاری است که به شما اجازه می‌دهد پیش از ثبت هر کامیت در گیت، مجموعه‌ای از بررسی‌ها یا اسکریپت‌ها را به‌صورت خودکار اجرا نمایید. این بررسی‌ها شامل فرمت‌ کردن کد، بررسی خطاهای رایج، اجرای لینترها یا حتی اجرای تست‌ها هستند.

در حالت عادی، توسعه‌دهندگان باید این کارها را به‌صورت دستی انجام دهند. اما در عمل معمولاً فراموش می‌شود یا به دلیل عجله انجام نمی‌شود. نتیجه این است که کدهای ناسازگار یا دارای خطا وارد مخزن گیت می‌شوند. pre-commit این مشکل را حل می‌نماید. وقتی این ابزار فعال باشد، پیش از هر commit، گیت مجموعه‌ای از hookها را اجرا می‌کند. اگر یکی از این بررسی‌ها با خطا روبه رو شود، commit انجام نمی‌شود تا مشکل برطرف شود.

در پروژه‌های جنگو که معمولاً چند توسعه‌دهنده روی یک مخزن گیت کار می‌کنند، این موضوع مهم‌تر می‌شود. استفاده از pre-commit سبب می‌شود تا:

  • فرمت کد در کل پروژه یکسان باشد.
  • خطاهای ساده قبل از ورود به مخزن شناسایی شوند.
  • کیفیت کد در طول زمان حفظ شود.
  • فرآیند code review ساده‌تر شود.

به همین علت است که در بسیاری از تیم‌های حرفه‌ای توسعه پایتون و جنگو، از pre-commit به‌عنوان بخشی از استاندارد پروژه به کار برده می‌شود.

 

hook در گیت چیست؟

برای درک بهتر pre-commit ابتدا باید مفهوم hook در گیت را بدانیم. Git hook در واقع اسکریپتی است که در زمان‌های مشخصی از فرآیند گیت اجرا می‌شود. به عنوان مثال:

  • قبل از commit.
  • بعد از commit.
  • قبل از push.
  • بعد از merge.

hookها به توسعه‌دهنده اجازه می‌دهند تا قبل یا بعد از انجام عملیات گیت، کارهای مشخصی را اجرا کند. pre-commit در واقع ابزاری است که مدیریت این hookها را آسان می‌کند. به جای اینکه خودتان اسکریپت‌های پیچیده بنویسید، می‌توانید از hookهای آماده به کار ببرید و آن‌ها را فقط با یک فایل تنظیمات فعال کنید.

 

نصب pre-commit در پروژه جنگو

اولین قدم برای استفاده از این ابزار، نصب آن می‌باشد. اگر که روی یک پروژه جنگویی کار می‌کنید، بهتر است pre-commit را در محیط مجازی پروژه خود نصب کنید.

ابتدا وارد محیط مجازی پروژه شوید و سپس دستور زیر را اجرا کنید:

pip install pre-commit

بعد از نصب pre-commit، باید hookهای pre-commit را در مخزن گیت فعال نمایید. با وارد کردن دستور زیر می‌توانید این کار را انجام دهید:

pre-commit install

با اجرای دستور بالا، یک اسکریپت در پوشه‌ی .git/hooks به وجود می‌آید که پیش از هر commit اجرا می‌شود اما هنوز هیچ بررسی خاصی تعریف نشده است. برای تعریف بررسی‌ها باید یک فایل تنظیمات به نام زیر در ریشه‌ی پروژه خود ایجاد کنید:

.pre-commit-config.yaml

در این فایل مشخص می‌کنید که چه ابزارهایی پیش از کامیت اجرا بشوند.

 

ساخت فایل پیکربندی pre-commit

فایل .pre-commit-config.yaml قلب اصلی تنظیمات این ابزار محسوب می‌شود. در این فایل مشخص می‌کنید که چه hookهایی فعال باشند.

یک نمونه ساده از این فایل به شکل زیر است:

repos:

  - repo: https://github.com/psf/black

    rev: 23.7.0

    hooks:

      - id: black

در این مثال، ابزار Black برای فرمت‌کردن خودکار کد پایتون استفاده می‌شود.

ساختار کلی این فایل شامل سه بخش اصلی است:

  • repo: مخزن گیت مربوط به ابزار.
  • rev: نسخه‌ای از ابزار که باید استفاده شود.
  • hooks: لیست hookهایی که باید اجرا شوند.

پس از ایجاد این فایل باید دستور زیر را اجرا کنید:

pre-commit install

و برای اجرای اولیه روی کل پروژه:

pre-commit run --all-files

این دستور تمام فایل‌های پروژه را بررسی می‌کند و در صورت نیاز اصلاح می‌کند.

 

استفاده از Black برای فرمت‌کردن کد

یکی از رایج‌ترین ابزارهایی که همراه pre-commit به کار برده می‌شود Black است. Black یک فرمت‌کننده خودکار کد پایتون می‌باشد که کدها را مطابق استاندارد مشخصی مرتب می‌کند. مزیت استفاده از Black این است که دیگر نیازی به بحث درباره سبک نوشتار کد نیست. همه فایل‌ها به‌صورت خودکار با یک استاندارد ثابت فرمت می‌شوند.

نمونه تنظیمات برای استفاده از Black در pre-commit:

repos:

  - repo: https://github.com/psf/black

    rev: 23.7.0

    hooks:

      - id: black

        language_version: python3

بعد از فعال‌سازی، هر بار که commit را انجام می‌دهید، Black اجرا می‌شود و اگر نیاز باشد کدها را اصلاح می‌کند. این موضوع در پروژه‌های جنگو که فایل‌های زیادی دارند، مفید می‌باشد.

 

استفاده از Flake8 برای بررسی کیفیت کد

در کنار فرمت کد، بررسی کیفیت کد هم مهم است. یکی از محبوب‌ترین ابزارها برای این کار Flake8 است.

Flake8 می‌تواند موارد زیر را بررسی کند:

  • importهای استفاده‌ نشده.
  • متغیرهای تعریف‌ شده اما استفاده‌ نشده.
  • خطاهای نحوی.
  • عدم رعایت استانداردهای PEP8

نمونه تنظیمات Flake8 در pre-commit:

repos:

  - repo: https://github.com/pycqa/flake8

    rev: 6.1.0

    hooks:

      - id: flake8

با اضافه‌کردن این hook، پیش از هر commit، کد شما را از نظر کیفیت بررسی می‌کند. اگر خطایی وجود داشته باشد، commit متوقف می‌شود تا زمانی که مشکل رفع گردد.

 

ترکیب چند ابزار در pre-commit

یکی از مزیت‌های مهم pre-commit این است که می‌توانید چندین ابزار را به صورت همزمان اجرا کنید.

در یک پروژه جنگو معمولاً ترکیبی از ابزارهای زیر استفاده می‌شود:

  • Black برای فرمت کد.
  • Flake8 برای lint.
  • isort برای مرتب‌سازی importها.
  • bandit برای بررسی مسائل امنیتی.

نمونه فایل تنظیمات:

repos:

  - repo: https://github.com/psf/black

    rev: 23.7.0

    hooks:

      - id: black

  - repo: https://github.com/pycqa/isort

    rev: 5.12.0

    hooks:

      - id: isort

  - repo: https://github.com/pycqa/flake8

    rev: 6.1.0

    hooks:

      - id: flake8

در این حالت هنگام commit، ابتدا importها مرتب می‌شوند، بعد کد فرمت می‌شود و در نهایت کیفیت کد بررسی می‌شود. این فرآیند سبب می‌شود تا کدهای ناسازگار، هرگز وارد مخزن نشوند.

 

اجرای تست‌ها پیش از commit

در برخی از پروژه‌های حساس، تیم‌ها ترجیح می‌دهند تا پیش از هر commit، تست‌های پروژه اجرا شوند. این کار سبب می‌شود تا خطاهای احتمالی، به سرعت شناسایی شوند. به عنوان مثال می‌توان یک hook سفارشی برای اجرای تست‌های جنگو تعریف کرد.

نمونه:

- repo: local

  hooks:

    - id: django-tests

      name: run django tests

      entry: python manage.py test

      language: system

      types: [python]

در این حالت، پیش از هر commit، تست‌های پروژه اجرا می‌شوند. اگر تستی شکست بخورد، commit انجام نمی‌شود. البته در پروژه‌های بزرگ ممکن است اجرای کامل تست‌ها زمان بسیاری بگیرد. در همچین شرایطی بهتر است تا این بررسی در مرحله CI صورت بگیرد.

 

اجرای دستی pre-commit

گاهی لازم است بررسی‌ها را بدون commit اجرا کنید. برای این کار می‌توانید از دستور زیر به کار ببرید:

pre-commit run

اگر که می‌خواهید بررسی بر روی همه فایل‌ها اجرا شود:

pre-commit run --all-files

این دستور معمولاً پس از اضافه‌کردن hookهای جدید استفاده می‌شود تا کل پروژه با تنظیمات جدید هماهنگ شود.

 

به‌روزرسانی hookها

ابزارهایی که در pre-commit به کار می‌برید، ممکن است نسخه‌های جدیدی را منتشر کنند. برای به‌روزرسانی آن‌ها می‌توانید دستور زیر را اجرا کنید:

pre-commit autoupdate

این دستور نسخه‌های جدید را در فایل پیکربندی ذخیره می‌کند. بعد از آن بهتر است یک commit جدید ایجاد کنید تا تیم پروژه هم از نسخه‌های جدید استفاده کند.

 

نکات مهم هنگام استفاده از pre-commit در تیم‌ها

اگر در یک تیم توسعه جنگو کار می‌کنید، رعایت چند نکته باعث می‌شود استفاده از pre-commit ساده‌تر باشد.

  • اول اینکه فایل .pre-commit-config.yaml باید در مخزن پروژه قرار بگیرد تا همه اعضای تیم از یک تنظیمات مشترک به کار ببرند.
  • دوم اینکه بهتر است در مستندات پروژه توضیح دهید که توسعه‌دهندگان پس از clone کردن مخزن باید دستور زیر را اجرا کنند:
pre-commit install

این کار سبب می‌شود hookها در سیستم آن‌ها فعال شوند. همچنین توصیه می‌شود از ابزارهای بسیار سنگین در مرحله pre-commit به کار نبرید؛ چون زمان commit را طولانی می‌کنند.

اگر سوالات بیش‌تری در ارتباط با این موضوع داشتید، حتما در بخش نظرات این نوشته برای ما بنویسید.

برای امتیاز به این نوشته کلیک کنید!
[کل: 1 میانگین: 5]