Jak przestrzegać standardów kodowania Drupala za pomocą haków Git

Opublikowany: 2023-05-23

Dobry kod jest jak dobrze zbudowane klocki Lego — jest mocny, dobrze wygląda i łatwo go zmienić, jeśli zajdzie taka potrzeba. Znaczenie dobrych standardów kodowania jest szczególnie duże, gdy kodujesz w zespole, pracujesz nad skalowalnym projektem lub uczestniczysz w społeczności open source, takiej jak Drupal.

Podobnie jak w przypadku każdego innego projektu typu open source, Drupal ma tysiące programistów pracujących nad projektem. A każdy z nich ma swój własny poziom wiedzy. Jak upewnić się, że wszyscy w zespole lub w społeczności przestrzegają dobrych praktyk kodowania? Git Hooks!

Git Hooks to łatwy i zautomatyzowany sposób na zapewnienie, że Twój kod zawsze spełnia standardy kodowania Drupala. Wdrożenie standardów kodowania Drupala za pomocą haka Git pomoże programistom zatwierdzić i wypchnąć kod zgodnie z odpowiednimi standardami kodowania zadeklarowanymi przez społeczność Drupala. Może również pomóc poprawić umiejętności zarządzania projektami i umożliwia programistom zatwierdzenie kodu z odpowiednimi standardami komunikatów zatwierdzenia. Dowiedz się więcej o hakach Git i sposobach ich wykorzystania.

haki git

Co to jest hak Git

Git Hooks to skrypty, które będą uruchamiane automatycznie za każdym razem, gdy wywołane zostanie polecenie Git. Tak jak używałbyś hook_form_alter do zmiany formularzy w Drupalu, możesz mieć osobne predefiniowane hooki dla każdej akcji Git.

haczyk git

Obrazkowa reprezentacja haka Git

Znajdowanie haków Git

Haki Git można znaleźć w folderze projektu (pod warunkiem, że Git jest zainicjowany) w .git/hooks . Znajdziesz tam wszystkie hooki z rozszerzeniem .sample , aby domyślnie uniemożliwić ich wykonanie.

Aby skorzystać z wymaganych haków, musisz usunąć rozszerzenie .sample i edytować swój kod do wykonania.

Dostępnych jest wiele haków Git, ale zamierzamy użyć gotowych haków Git do zainicjowania standardów kodowania Drupala.

Haki Git przed zatwierdzeniem to haki, które zostaną uruchomione przed zatwierdzeniem kodu. Sprawdza linię kodu, która jest zatwierdzana.

Implementacja hooków Git

Zanim zaczniesz, upewnij się, że masz przygotowane te podstawowe wymagania:

  • Kompozytor
  • Git
  • Php-code-sniffer
  • drupal/koder: 8.3.13

Poniższa procedura dotyczy instalacji na urządzeniach Mac. Link referencyjny można znaleźć tutaj, aby uzyskać instrukcje dotyczące instalacji na innych urządzeniach.

  • napar zainstaluj php-code-sniffer
  • globalny kompozytor wymaga drupal/coder: 8.3.13
  • phppcs --config-set install_paths ~/.composer/vendor/drupal/coder/coder_sniffer
  • phppcs -i → Daje zainstalowane standardy kodowania.

Zaczynajmy!

Tworzę nowy projekt Drupala o nazwie demo . Możesz go również użyć w swoim istniejącym projekcie.

Demo projektu drupala

→ Za pomocą polecenia cd weszliśmy do folderu projektu.
demo cd

→ inicjowanie git w projekcie
Inicjalizacja Gita

→ Dodanie i dokonanie mojego pierwszego zatwierdzenia.
git commit -m „Początkowe zatwierdzenie”

Początkowe zatwierdzenie

→ Instalowanie sniffera kodu php za pomocą poniższego polecenia dla komputerów Mac.
napar zainstaluj php-code-sniffer

automatycznie aktualizowane

→ Instalowanie kodera Drupala przy użyciu kompozytora
globalny kompozytor wymaga drupal/coder: 8.3.13

→ Po zdefiniowaniu kodera i jego ścieżki otrzymasz następujące dane wyjściowe, jak pokazano na poniższym obrazku.
phppcs --config-set install_paths ~/.composer/vendor/drupal/coder/coder_sniffer

→ phppcs -i
Powyższe polecenie da ci Drupal i DrupalPractice

wąchać

→ Teraz możesz zatwierdzić swój kod. Jeśli wystąpi jakikolwiek błąd w składni lub standardowym kodowaniu, zostaniesz o tym poinformowany na wyświetlaczu, a proces zatwierdzenia zostanie przerwany.

popełnić kod

→ Poniżej znajduje się kod do automatycznego naprawienia błędu

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

Wszelkie inne problemy będą musiały zostać rozwiązane ręcznie. Zatwierdź swój kod po zakończeniu.

naprawić kod błędu

Gdy twój kod będzie czysty, pozwoli ci to zatwierdzić kod

kod testowy

Po prostu skopiuj i wklej kod w pre-commit.sample w .git/hooks. Nie zapomnij usunąć przykładowych rozszerzeń.

Próbka kodu przed zatwierdzeniem:

 #!/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

Końcowe przemyślenia

Mam nadzieję, że ten artykuł był dla Ciebie interesujący i że pomoże Ci pisać lepszy kod, ponieważ lepszy kod oznacza lepszą sieć! Podobało ci się to, co właśnie przeczytałeś? Rozważ subskrypcję naszego cotygodniowego biuletynu i otrzymuj informacje techniczne, takie jak ten, dostarczane do Twojej skrzynki odbiorczej!