So halten Sie sich mit Git Hooks an Drupal-Codierungsstandards

Veröffentlicht: 2023-05-23

Guter Code ist wie gut gebaute Lego-Kreationen – er ist stark, sieht gut aus und lässt sich bei Bedarf leicht ändern. Die Bedeutung guter Codierungsstandards ist besonders wichtig, wenn Sie im Team programmieren, an einem skalierbaren Projekt arbeiten oder an einer Open-Source-Community wie Drupal teilnehmen.

Wie bei jedem anderen Open-Source-Projekt arbeiten auch bei Drupal Tausende von Entwicklern an dem Projekt. Und jeder von ihnen verfügt über sein eigenes Fachwissen. Wie stellen Sie sicher, dass jeder in Ihrem Team oder in der Community gute Codierungspraktiken befolgt? Git Hooks!

Git-Hooks sind eine einfache und automatisierte Möglichkeit, sicherzustellen, dass Ihr Code immer den Codierungsstandards von Drupal entspricht. Die Implementierung von Drupal-Codierungsstandards mit Git-Hook hilft Entwicklern, den Code mit den richtigen Codierungsstandards, wie von der Drupal-Community deklariert, festzuschreiben und zu pushen. Es kann auch dazu beitragen, Ihre Projektmanagementfähigkeiten zu verbessern und Entwicklern das Festschreiben von Code mit den richtigen Standards für Festschreibungsnachrichten zu ermöglichen. Erfahren Sie mehr über Git-Hooks und wie Sie sie in die Tat umsetzen.

Git-Hooks

Was ist ein Git-Hook?

Git-Hooks sind Skripte, die jedes Mal automatisch ausgeführt werden, wenn ein Git-Befehl aufgerufen wird. So wie Sie „hook_form_alter“ verwenden würden, um die Formulare in Drupal zu ändern, können Sie für jede Git-Aktion separate vordefinierte Hooks haben.

Git Hook

Die bildliche Darstellung von Git Hook

Git-Hooks finden

Sie finden Git-Hooks in Ihrem Projektordner (vorausgesetzt, Git ist initialisiert) unter .git/hooks . Dort finden Sie alle Hooks mit der Erweiterung .sample , um zu verhindern, dass sie standardmäßig ausgeführt werden.

Um die erforderlichen Hooks nutzen zu können, müssen Sie die Erweiterung .sample entfernen und Ihren Code für die Ausführung bearbeiten.

Es sind viele Git-Hooks verfügbar, wir werden jedoch Pre-Commit -Git-Hooks verwenden, um Drupal-Codierungsstandards zu initiieren.

Pre-Commit- Git-Hooks sind Hooks, die ausgeführt werden, bevor der Code festgeschrieben wird. Es prüft, ob die Codezeile festgeschrieben wird.

Git-Hooks implementieren

Bevor Sie beginnen, stellen Sie sicher, dass Sie über die folgenden Grundvoraussetzungen verfügen:

  • Komponist
  • Git
  • PHP-Code-Sniffer
  • drupal/coder:8.3.13

Das folgende Verfahren dient zur Installation auf Mac-Geräten. Den Referenzlink für Installationsanweisungen auf anderen Geräten finden Sie hier.

  • brew installiere PHP-Code-Sniffer
  • Composer Global erfordert Drupal/Coder:8.3.13
  • phpks --config-set install_paths ~/.composer/vendor/drupal/coder/coder_sniffer
  • phpcs -i → Gibt Ihnen installierte Codierungsstandards.

Lass uns anfangen!

Ich erstelle ein neues Drupal-Projekt namens demo . Sie können es auch in Ihrem bestehenden Projekt verwenden.

Drupal-Projektdemo

→ Mit dem Befehl cd gelangten wir in den Projektordner.
CD-Demo

→ Git im Projekt initialisieren
Git-Init

→ Ich füge meinen ersten Commit hinzu und mache ihn.
git commit -m „Erstes Commit“

Erster Commit

→ Installieren des PHP-Code-Sniffers mit dem folgenden Befehl für Mac.
brew installiere PHP-Code-Sniffer

automatisch aktualisiert

→ Drupal-Codierer mit Composer installieren
Composer Global erfordert Drupal/Coder:8.3.13

→ Sobald der Codierer und sein Pfad definiert sind, erhalten Sie die folgende Ausgabe, wie im Bild unten gezeigt.
phpks --config-set install_paths ~/.composer/vendor/drupal/coder/coder_sniffer

→ phpcs -i
Mit dem obigen Befehl erhalten Sie Drupal und DrupalPractice

Schnüffler

→ Jetzt können Sie Ihren Code festschreiben. Wenn Sie einen Syntax- oder Codierungsstandardfehler haben, werden Sie in der Anzeige benachrichtigt und Ihr Commit-Prozess wird abgebrochen.

Commit-Code

→ Nachfolgend finden Sie den Code zur automatischen Behebung des Fehlers

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

Alle anderen Probleme müssen manuell behoben werden. Übernehmen Sie Ihren Code, sobald Sie fertig sind.

Fehlercode beheben

Sobald Ihr Code sauber ist, können Sie ihn festschreiben

Testcode

Kopieren Sie einfach den Code und fügen Sie ihn in pre-commit.sample innerhalb von .git/hooks ein. Vergessen Sie nicht, Beispielerweiterungen zu entfernen.

Codebeispiel vor dem Commit:

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

Abschließende Gedanken

Ich hoffe, dass Sie diesen Artikel interessant fanden und dass er Ihnen hilft, besseren Code zu schreiben, denn besserer Code bedeutet ein besseres Web! Hat Ihnen gefallen, was Sie gerade gelesen haben? Erwägen Sie, unseren wöchentlichen Newsletter zu abonnieren und technische Einblicke wie diesen direkt in Ihren Posteingang zu erhalten!