วิธีปฏิบัติตามมาตรฐานการเข้ารหัส Drupal ด้วย Git Hooks

เผยแพร่แล้ว: 2023-05-23

โค้ดที่ดีก็เหมือนกับเลโก้ที่สร้างมาอย่างดี แข็งแรง ดูดี และเปลี่ยนได้ง่ายหากต้องการ ความสำคัญของมาตรฐานการเขียนโค้ดที่ดีนั้นสูงเป็นพิเศษเมื่อคุณเขียนโค้ดในทีม ทำงานในโครงการที่ปรับขนาดได้ หรือเข้าร่วมในชุมชนโอเพ่นซอร์สอย่าง Drupal

เช่นเดียวกับโครงการโอเพ่นซอร์สอื่น ๆ Drupal มีนักพัฒนาหลายพันคนที่ทำงานในโครงการ และแต่ละคนมาพร้อมกับระดับความเชี่ยวชาญของตนเอง คุณจะแน่ใจได้อย่างไรว่าทุกคนในทีมของคุณหรือในชุมชนปฏิบัติตามแนวทางการเขียนโค้ดที่ดี Git Hooks!

Git Hooks เป็นวิธีที่ง่ายและเป็นไปโดยอัตโนมัติในการรับรองว่ารหัสของคุณตรงตามมาตรฐานการเข้ารหัสของ Drupal เสมอ การนำ Drupal Coding Standards มาใช้กับ Git hook จะช่วยให้นักพัฒนาสามารถคอมมิตและพุชโค้ดด้วยมาตรฐานการเข้ารหัสที่เหมาะสมตามที่ประกาศโดยชุมชน Drupal นอกจากนี้ยังสามารถช่วยพัฒนาทักษะการจัดการโครงการของคุณและช่วยให้นักพัฒนาสามารถคอมมิตโค้ดด้วยมาตรฐานข้อความคอมมิตที่เหมาะสม เรียนรู้เพิ่มเติมเกี่ยวกับ Git hooks และวิธีนำไปใช้จริง

ตะขอคอมไพล์

Git Hook คืออะไร

Git Hooks เป็นสคริปต์ที่จะทำงานโดยอัตโนมัติทุกครั้งที่มีการเรียกใช้คำสั่ง Git เช่นเดียวกับที่คุณใช้ hook_form_alter เพื่อแก้ไขฟอร์มใน Drupal คุณสามารถมี hooks ที่กำหนดไว้ล่วงหน้าแยกต่างหากสำหรับทุกการทำงานของ Git

เบ็ดคอมไพล์

การแสดงรูปภาพของ Git hook

ค้นหาตะขอ Git

คุณสามารถค้นหา Git hooks ในโฟลเดอร์โปรเจ็กต์ของคุณ (หาก Git ได้รับการเริ่มต้น) ภายใต้ .git/hooks คุณจะพบ hooks ทั้งหมดที่มีนามสกุล .sample เพื่อป้องกันไม่ให้ดำเนินการตามค่าเริ่มต้น

หากต้องการใช้ hooks ที่จำเป็น คุณต้องลบส่วนขยาย .sample และแก้ไขโค้ดของคุณเพื่อดำเนินการ

มี Git hooks มากมาย แต่เรากำลังจะใช้ Git hooks แบบ pre-commit เพื่อเริ่มต้นมาตรฐานการเข้ารหัส Drupal

Pre-commit Git hooks คือ hooks ที่จะรันก่อนที่โค้ดจะถูกคอมมิต จะตรวจสอบบรรทัดของรหัสที่ได้รับความมุ่งมั่น

การใช้ Git Hooks

ก่อนที่คุณจะเริ่ม ตรวจสอบให้แน่ใจว่าคุณมีข้อกำหนดพื้นฐานเหล่านี้พร้อมแล้ว:

  • นักแต่งเพลง
  • คอมไพล์
  • Php-code-sniffer
  • drupal/โคเดอร์:8.3.13

ขั้นตอนด้านล่างใช้สำหรับติดตั้งในอุปกรณ์ Mac คุณสามารถค้นหาลิงค์อ้างอิงได้ที่นี่สำหรับคำแนะนำในการติดตั้งบนอุปกรณ์อื่นๆ

  • ชงติดตั้ง php-code-sniffer
  • นักแต่งเพลงทั่วโลกต้องการ drupal/coder:8.3.13
  • phpcs --config-set installed_paths ~/.composer/vendor/drupal/coder/coder_sniffer
  • phpcs -i → จะให้มาตรฐานการเข้ารหัสที่ติดตั้งแก่คุณ

เอาล่ะ!

ฉันกำลังสร้างโครงการ Drupal ใหม่ชื่อ demo คุณสามารถใช้ในโครงการที่มีอยู่ของคุณได้เช่นกัน

การสาธิตโครงการ drupal

→ ใช้คำสั่ง cd เราเข้าไปในโฟลเดอร์โครงการ
ซีดีสาธิต

→ การเริ่มต้นคอมไพล์ในโครงการ
เริ่มต้นคอมไพล์

→ การเพิ่มและทำคอมมิทครั้งแรกของฉัน
git commit -m “คอมมิชชันเริ่มต้น”

ความมุ่งมั่นเริ่มต้น

→ การติดตั้ง php code sniffer โดยใช้คำสั่งด้านล่างสำหรับ Mac
ชงติดตั้ง php-code-sniffer

อัปเดตอัตโนมัติ

→ การติดตั้ง Drupal coder โดยใช้ผู้แต่ง
นักแต่งเพลงทั่วโลกต้องการ drupal/coder:8.3.13

→ เมื่อกำหนดโคเดอร์และเส้นทางแล้ว คุณจะได้ผลลัพธ์ต่อไปนี้ดังภาพด้านล่าง
phpcs --config-set installed_paths ~/.composer/vendor/drupal/coder/coder_sniffer

→ phpcs -i
คำสั่งดังกล่าวจะให้ Drupal และ DrupalPractice แก่คุณ

ดมกลิ่น

→ ตอนนี้คุณสามารถส่งรหัสของคุณ หากคุณมีข้อผิดพลาดทางไวยากรณ์หรือมาตรฐานการเข้ารหัส คุณจะได้รับแจ้งในหน้าจอและกระบวนการยืนยันของคุณจะถูกยกเลิก

คอมมิตโค้ด

→ ด้านล่างคือรหัสสำหรับแก้ไขข้อผิดพลาดโดยอัตโนมัติ

phpcbf --standard=Drupal --extensions=php,module,inc,install,test,profile,theme,css,info,txt,md,yml web/modules/custom/demo

ปัญหาอื่นๆ จะต้องได้รับการแก้ไขด้วยตนเอง ยืนยันรหัสของคุณเมื่อเสร็จแล้ว

แก้ไขรหัสข้อผิดพลาด

เมื่อรหัสของคุณสะอาดก็จะอนุญาตให้คุณยอมรับรหัส

รหัสทดสอบ

เพียงคัดลอกและวางโค้ดใน pre-commit.sample ภายใน .git/hooks อย่าลืมลบส่วนขยายตัวอย่าง

ตัวอย่างโค้ดล่วงหน้า:

 #!/bin/bash # Redirect output to stderr. exec 1>&2 # Color codes for the error message. redclr=`tput setaf 1` greenclr=`tput setaf 2` blueclr=`tput setaf 4` reset=`tput sgr0` # Printing the notification in the display screen. echo "${blueclr}" echo "................................. Validating your codes ……..…………....." echo "-----------------------------------------------------------${reset}" # Mentioning the directories which should be excluded. dir_exclude='\/kint\/|\/contrib\/|\/devel\/|\/libraries\/|\/vendor\/|\.info$|\.png$|\.gif$|\.jpg$|\.ico$|\.patch$|\.htaccess$|\.sh$|\.ttf$|\.woff$|\.eot$|\.svg$' # Checking for the debugging keyword in the commiting code base. keywords=(ddebug_backtrace debug_backtrace dpm print_r var_dump dump console\.log) keywords_for_grep=$(printf "|%s" "${keywords[@]}") keywords_for_grep=${keywords_for_grep:1} # Flags for the counter. synatx_error_found=0 debugging_function_found=0 merge_conflict=0 coding_standard_error=0 # Checking for PHP syntax errors. changed_files=`git diff-index --diff-filter=ACMRT --cached --name-only HEAD -- | egrep '\.theme$|\.module$|\.inc|\.php$'` if [ -n "$changed_files" ] then for FILE in $changed_files; do php -l $FILE > /dev/null 2>&1 compiler_result=$? if [ $compiler_result -eq 255 ] then if [ $synatx_error_found -eq 0 ] then echo "${redclr}" echo "# Compilation error(s):" echo "=========================${reset}" fi synatx_error_found=1 `php -l $FILE > /dev/null` fi done fi # Checking for debugging functions. files_changed=`git diff-index --diff-filter=ACMRT --cached --name-only HEAD -- | egrep -v $dir_exclude` if [ -n "$files_changed" ] then for FILE in $files_changed ; do for keyword in "${keywords[@]}" ; do pattern="^\+(.*)?$keyword(.*)?" resulted_files=`git diff --cached $FILE | egrep -x "$pattern"` if [ ! -z "$resulted_files" ] then if [ $debugging_function_found -eq 0 ] then echo "${redclr}" echo "Validating keywords" echo "================================================${reset}" fi debugging_function_found=1 echo "Debugging function" $keyword git grep -n $keyword $FILE | awk '{split($0,a,":"); printf "\found in " a[1] " in line " a[2] "\n"; }' fi done done fi # Checking for Drupal coding standards changed_files=`git diff-index --diff-filter=ACMRT --cached --name-only HEAD -- | egrep -v $dir_exclude | egrep '\.php$|\.module$|\.inc$|\.install$|\.test$|\.profile$|\.theme$|\.js$|\.css$|\.info$|\.txt$|\.yml$'` if [ -n "$changed_files" ] then phpcs_result=`phpcs --standard=Drupal --extensions=php,module,inc,install,test,profile,theme,css,info,txt,md,yml --report=csv $changed_files` if [ "$phpcs_result" != "File,Line,Column,Type,Message,Source,Severity,Fixable" ] then echo "${redclr}" echo "# Hey Buddy, The hook found some issue(s)." echo "---------------------------------------------------------------------------------------------${reset}" phpcs --standard=Drupal --extensions=php,module,inc,install,test,profile,theme,css,info,txt,md,yml $changed_files echo "<=======> Run below command to fix the issue(s)" echo "# phpcbf --standard=Drupal --extensions=php,module,inc,install,test,profile,theme,css,info,txt,md,yml your_custom_module_or_file_path" echo “<====================================================>" echo "# To skip the Drupal Coding standard issue(s), Please use this commands << git commit -m your commit Message --no-verify >>" echo "-----------------------------------------------------------------------------------------------------------------------------------------${reset}" coding_standard_error=1 fi fi # Checking for merge conflict markers. files_changed=`git diff-index --diff-filter=ACMRT --cached --name-only HEAD --` if [ -n "$files_changed" ] then for FILE in $files_changed; do pattern="(<<<<|====|>>>>)+.*(\n)?" resulted_files=`egrep -in "$pattern" $FILE` if [ ! -z "$resulted_files" ] then if [ $merge_conflict -eq 0 ] then echo "${redclr}" echo "-----------------------Unable to commit the file(s):------------------------" echo "-----------------------------------${reset}" fi merge_conflict=1 echo $FILE fi done fi # Printing final result errors_found=$((synatx_error_found+debugging_function_found+merge_conflict+coding_standard_error)) if [ $errors_found -eq 0 ] then echo "${greenclr}" echo "Wow! It is clean code" echo "${reset}" else echo "${redclr}" echo "Please Correct the errors mentioned above. We are aborting your commit." echo "${reset}" exit 1 fi

ความคิดสุดท้าย

ฉันหวังว่าคุณจะพบว่าบทความนี้น่าสนใจและช่วยให้คุณเขียนโค้ดได้ดีขึ้น เพราะโค้ดที่ดีกว่าหมายถึงเว็บที่ดีกว่า! ชอบสิ่งที่คุณเพิ่งอ่าน? ลองสมัครรับจดหมายข่าวรายสัปดาห์ของเราและรับข้อมูลเชิงลึกด้านเทคนิคเช่นนี้ที่ส่งถึงกล่องจดหมายของคุณ!