برنامه نویسی

استاندارد سازی مرتکب Git با یک اسکریپت Bash می شود: یک راه حل ساده برای یک مشکل مشترک

فهرست

  1. کمیته های معنایی چیست و چرا آنها مهم هستند
  2. منشأ مشکل
  3. راه حل: یک قلاب قلاب در Bash
  4. اسکریپت آناتومیا

  5. نصب و استفاده
  6. نتیجه گیری و درس آموخته شده
  7. سؤالات متداول – سوالات متداول
  8. مراحل بعدی
  9. اشارات کتابشناسی

کمیته های معنایی چیست و چرا آنها مهم هستند

کمیته های معنایی یک کنوانسیون برای نوشتن پیام های متعهد استاندارد است که به وضوح قصد تغییر هر کد را دارند. این رویکرد ناشی از کنوانسیون معمولی Commitis است که به نوبه خود از دستورالعمل های تعهد زاویه ای الهام گرفته شده است ، که توسط تیم Google در توسعه زاویه ای استفاده می شد.

ایده اصلی این است که هر تعهد باید به صراحت هدف خود را از طریق یک قالب ساختاری توصیف کند:

tipo(escopo): descrição
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

منشأ و تکامل

کنوانسیون تعهد معنایی در حدود سال های 2015-2016 محبوبیت پیدا کرد ، هنگامی که تیم های توسعه شروع به تحقق نیاز به استاندارد سازی پیام های تعهد برای تسهیل اتوماسیون فرآیند مانند تولید ChangeLog و نسخه معنایی کردند. در ابتدا توسط پروژه های JavaScript اتخاذ شده است ، این عمل به زبان ها و اکوسیستم های مختلف گسترش یافته است.

انواع کمیته ها

هر پیام متعهد با “نوع” شروع می شود که ماهیت تغییر را نشان می دهد:

  • نشان: عملکرد جدیدی را در کد معرفی می کند
  • ثابت کردن: یک اشکال یا مشکل را اصلاح می کند
  • اسناد: فقط در مستندات تغییر می کند
  • سبک: تغییراتی که بر معنی کد تأثیر نمی گذارد (فضاها ، قالب بندی و غیره)
  • اصلاح کننده: تغییر کد که یک اشکال را اصلاح نمی کند یا یک ویژگی را اضافه نمی کند
  • عطر: بهبود عملکرد
  • تست: افزودن یا تصحیح آزمون
  • ساخت: تغییر در سیستم ساخت یا وابستگی های خارجی
  • سیخ: تغییر در پرونده های پیکربندی CI/CD
  • کوشش: سایر تغییراتی که SRC یا پرونده های تست را تغییر نمی دهد
  • بازگشت: بازگشت به قدامی

کجا:

  • دامنه: اختیاری ، بخشی از کد آسیب دیده را نشان می دهد
  • شرح: توضیح می دهد که چه کاری انجام شده است

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

  1. خوانایی: هر کسی می تواند به سرعت هدف یک تعهد را درک کند
  2. اتهام اتوماسیون: به شما امکان می دهد ChangeLogs و نسخه معنایی را به صورت خودکار تولید کنید
  3. سازمان: کمیته های فیلتر را بر اساس نوع تسهیل می کند (فقط اصلاحات ، فقط ویژگی های جدید)
  4. تاریخ قابل توجه: تاریخ تعهدات را به یک اسناد ارزشمند تبدیل می کند

در تیم های بزرگ یا پروژه های بلند مدت ، این استاندارد سازی حتی بسیار مهم تر می شود زیرا به هماهنگی همه با تغییرات ایجاد شده کمک می کند.

منشأ مشکل

هنگام کار بر روی چندین پروژه توسعه دهندگان ، من به اهمیت حفظ سابقه تعهدات سازمان یافته و آموزنده فهمیدم.

انگیزه اصلی من برای ایجاد این اسکریپت از تجربه قبلی من به عنوان یک توسعه دهنده کامل پشته ناشی شد ، هنگامی که من فرصتی برای اجرای Husky در اکوسیستم Node.js داشتم – ابزاری که به سادگی “قفل” می کند که از الگوی مورد نظر پیروی نمی کنند. بعد از دیدن تأثیر مثبت این عمل ، من برای پروژه های جاوا فعلی خود به همان اندازه مؤثر و ساده می خواستم بدون نیاز به تنظیمات پیچیده یا وابستگی های اضافی.

اگرچه برخی از ابزارهای مشابه مانند Jhusky (نسخه اصلی جاوا با رنگ هاوسکی) و برخی از افزونه های قلاب های Maven Git وجود دارد ، اما دریافتم که بسیاری از این راه حل ها به وابستگی های خاص نیاز دارند یا عمیقاً با یک اکوسیستم واحد یکپارچه شده اند. من چیزی واقعاً سبک و قابل حمل می خواستم که بدون در نظر گرفتن فن آوری های مورد استفاده در پروژه ، در هر محیط توسعه کار کند.

این زمانی است که من تصمیم گرفتم ابزار خودم را با استفاده از BASH ، زبانی که تقریباً در هر محیط توسعه موجود است ، ایجاد کنم و به تیم هایی که دارای فناوری های مختلط هستند اجازه می دهند بدون نیاز به نصب ابزارهای خاص زبان ، از مزایای استاندارد سازی استفاده کنند.

راه حل: یک قلاب قلاب در Bash

سپس تصمیم گرفتم یک راه حل ساده ایجاد کنم: یک اسکریپت Bash که یک قلاب GIT را برای اعتبارسنجی پیام های متعهد نصب می کند ، و اطمینان حاصل می کند که آنها از استاندارد کمیته های معنایی پیروی می کنند.

چرا باش؟ از آنجا که تقریباً در هر سیستم مانند یونیکس در دسترس است ، به وابستگی های خارجی احتیاج ندارد و هر توسعه دهنده می تواند آن را به نیازهای خاص خود تغییر دهد.

ارائه فیلمنامه

فیلمنامه ای که من تهیه کردم دو بخش اصلی دارد: قلاب commit-msg که اعتبار خود را انجام می دهد ، و یک مدیر برای نصب/حذف این قلاب در مخازن GIT.

این همان کاری است که او انجام می دهد:

  1. قلاب ایجاد می کند commit-msg که با استفاده از عبارات منظم ، پیام های متعهد را تأیید می کند
  2. بازخوردهای بصری رنگارنگ را هنگام رد کردن نشان دهید
  3. نمونه های صحیحی را برای کمک به توسعه دهنده ارائه می دهد
  4. به شما امکان می دهد قلاب را در یک مخزن خاص یا کلیه مخازن موجود در سیستم نصب کنید
  5. یک رابط دوستانه برای مدیریت قلاب ارائه می دهد

اسکریپت آناتومیا

قلاب اعتبار سنجی

بخش اصلی اسکریپت خود هوک است که پیام تعهد را با استفاده از یک عبارت منظم تأیید می کند:

pattern="^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\([a-zA-Z0-9_-]+\))?: .{1,}"

if ! [[ $commit_msg =~ $pattern ]]; then
    # Exibe mensagem de erro formatada com instruções
    # ...
    exit 1
fi
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این عبارت منظم تضمین می کند که هر تعهد با یک نوع معتبر (شاهکار ، رفع ، اسناد و غیره) شروع می شود ، به صورت اختیاری به دنبال دامنه پرانتز و سپس با توضیحات.

هنگامی که یک پیام از این الگوی پیروی نمی کند ، اسکریپت یک پیام خطای رنگی را نشان می دهد که قالب صحیح را توضیح می دهد و مثالهایی را نشان می دهد:

draw_box "ERRO: Mensagem de commit não segue o padrão semântico!" "$RED"
echo -e "\n$RED""Seu commit:$RESET $commit_msg"
echo -e "\n$YELLOW$BOLD""O formato correto é:$RESET (): "
# ... explicação dos tipos válidos ...
echo -e "\n$BOLD$GREEN""Exemplos:$RESET"
draw_box "feat(login): adiciona validação de e-mail" "$GREEN"
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مثال: پیام در برگه کنسول GIT نمایش داده می شود.

شرح تصویر

نمونه های سریع

❌ متعهد غیرقانونی (نادرست)) ✅ تعهدات معنایی (صحیح)
“اشکال ورود به سیستم” fix(auth): corrige validação de senha na tela de login
“دکمه جدید اضافه شده” feat(ui): adiciona botão de exportar na tela de relatórios
“به روزرسانی اسناد” docs(readme): atualiza instruções de instalação
“بهبود کد” refactor(core): simplifica lógica de processamento de pagamentos

مدیر قلاب

اسکریپت اصلی یک رابط منو به:

  1. قلاب را در یک مخزن خاص یا در سطح جهان نصب کنید
  2. قلاب ها را از یک مخزن خاص یا در سطح جهان جدا کنید
  3. Sair Do Script

منو ساده و شهودی است:

echo -e "${CYAN}===== ${BOLD}Gerenciador de Git Hook ($HOOK_NAME)${RESET}${CYAN} =====${RESET}"
echo -e "${BLUE}1)${RESET} ${BOLD}Instalar hook${RESET}"
echo -e "${BLUE}2)${RESET} ${BOLD}Remover hook${RESET}"
echo -e "${BLUE}3)${RESET} ${BOLD}Sair${RESET}"
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

با انتخاب گزینه های 1 یا 2 ، به زیرزمین ارائه می شود که به شما امکان می دهد بین عملیات را در یک مخزن خاص یا کلیه مخازن سیستم انتخاب کنید.

نصب و استفاده

نصب اسکریپت ساده است:

# Clone o repositório
git clone https://github.com/diegoSbrandao/git-hook-manager.git
cd git-hook-manager

# Torne o script executável
chmod +x install-windows-hook.sh

# Execute o script
./install-windows-hook.sh
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پس از اجرای اسکریپت ، یک منوی تعاملی را مشاهده خواهید کرد:

===== Gerenciador de Git Hook (commit-msg) =====
1) Instalar hook
2) Remover hook
3) Sair
Escolha uma opção:
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

گزینه های منو:

1) قلاب استرالیا

  • 1.1) قلاب را از یک مسیر نصب کنید: برای اضافه کردن قلاب به یک مخزن خاص.
  • 1.2) قلاب را روی همه مخازن سیستم نصب کنید: برای نصب جهانی.

2) قلاب پاک کننده

  • 2.1) قلاب را از یک مخزن خاص جدا کنید: فقط قلاب های نصب شده توسط این اسکریپت را حذف می کند.
  • 2.2) قلاب ها را از همه مخازن سیستم حذف کنید: برای حذف جهانی.

این اسکریپت به گونه ای طراحی شده است که با Linux ، MacOS ، WSL و Git Bash در ویندوز سازگار باشد و فقط به الزامات اساسی مانند نیاز دارد bashبا find اشمیه grep، که معمولاً در این سیستم ها در دسترس هستند.

نتیجه گیری و درس آموخته شده

آنچه من از این تجربه آموختم این است که بعضی اوقات راه حل های ساده مشکلات پیچیده را حل می کند. فیلمنامه بیش از 150 خط کد Bash نیست ، اما تأثیر قابل توجهی در کیفیت کار ما داشته است.

من همچنین آموخته ام که استاندارد سازی ثبات را به همراه می آورد ، و ثبات همکاری را تسهیل می کند. وقتی همه از همان الگوی پیروی می کنند ، ارتباطات بهتر جریان می یابد.

سرانجام ، من یاد گرفتم که ابزارهایی که به توسعه دهندگان کمک می کنند تا از شیوه های خوب پیروی کنند ، به اندازه خود شیوه های خوب اهمیت دارند. در صورت تسهیل پیروی از آنها ، هیچ فایده ای برای ایجاد قوانین ندارد.

سؤالات متداول – سوالات متداول

س: آیا فیلمنامه از تعهداتی که معناشناسی نیستند جلوگیری می کند؟

الف: بله ، هوک به طور خودکار تعهدات نامعتبر را رد می کند و یک پیام خطای توضیحی را با مثال های صحیح نشان می دهد.

س: آیا می توان انواع متعهد پذیرفته شده را سفارشی کرد؟

الف: بله ، می توانید اسکریپت را ویرایش کرده و عبارت معمولی را که انواع معتبر را تعریف می کند اصلاح کنید.

س: آیا اسکریپت در محیط های ویندوز کار می کند؟

الف: بله ، با Git Bash و WSL (زیر سیستم ویندوز برای لینوکس) در ویندوز سازگار است.

س: آیا نصب به طور خودکار بر تمام مخازن من تأثیر می گذارد؟

الف: نه ، شما باید انتخاب کنید که آیا می خواهید در یک مخزن خاص یا همه نصب کنید ، و کنترل کامل را به کاربر می دهد.

س: آیا قلاب بر تعهداتی که قبلاً انجام شده است تأثیر می گذارد؟

الف: نه ، هوک فقط تعهدات جدید را تأیید می کند ، نه تغییر تاریخ موجود.

مراحل بعدی

مهم است که این اسکریپت در حال حاضر در نسخه بتا باشد و هنوز در دست توسعه است. به عنوان بخشی از برنامه های آینده ، من می خواهم با ادغام آن به عنوان افزونه ای برای ایده Maven یا Intellij ، عملکرد آن را گسترش دهم و آن را برای توسعه دهندگان جاوا حتی در دسترس تر قرار دهم.

هنگامی که این نسخه ها در دسترس هستند ، من این مستندات را با اطلاعات و دستورالعمل های جدید برای استفاده به روز می کنم. اگر علاقه مند به مشارکت در این پروژه هستید یا پیشنهادهایی برای این پیاده سازی های آینده دارید ، در این مخزن تماس بگیرید یا با یک مسئله تماس بگیرید.

اشارات کتابشناسی

  1. Chacon ، S. ؛ Straub ، B. طرفدار بروبشر 2. ed. Inss ، 2014. موجود در: https://git-scm.com/book/en/v2

  2. تعهدات متعارف. متعارف 1.0.0بشر موجود در: https://www.conventinalcommitts.org/


استفاده کردن: این پروژه تحت مجوز MIT مجوز دارد و در: https://github.com/diegosbrandao/git-hok-manager.git در دسترس است. احساس راحتی کنید تا با نیازهای پروژه یا تیم خود سازگار شوید. و اگر پیشنهادی برای بهبود دارید ، خوشحال می شوم که آنها را دریافت کنم!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا