Come aderire agli standard di codifica Drupal con Git Hooks

Pubblicato: 2023-05-23

Un buon codice è come le creazioni Lego ben costruite: è forte, ha un bell'aspetto ed è facile da modificare se necessario. L'importanza di buoni standard di codifica è particolarmente elevata quando si codifica in un team, si lavora su un progetto scalabile o si partecipa a una comunità open source come Drupal.

Come con qualsiasi altro progetto open source, Drupal ha migliaia di sviluppatori che lavorano al progetto. E ognuno di loro ha il proprio livello di competenza. Come garantite che tutti i membri del vostro team o della comunità seguano buone pratiche di programmazione? Git Hooks!

I Git Hooks sono un modo semplice e automatizzato per garantire che il tuo codice soddisfi sempre gli standard di codifica di Drupal. L'implementazione degli standard di codifica Drupal con Git hook aiuterà gli sviluppatori a eseguire il commit e il push del codice con gli standard di codifica appropriati, come dichiarato dalla comunità Drupal. Può anche aiutare a migliorare le tue capacità di gestione del progetto e consente agli sviluppatori di eseguire il commit del codice con standard di messaggio di commit adeguati. Scopri di più sugli hook di Git e su come metterli in azione.

git ganci

Che cos'è un gancio Git

I Git Hooks sono script che verranno eseguiti automaticamente ogni volta che viene richiamato un comando Git. Proprio come useresti hook_form_alter per modificare i moduli in Drupal, puoi avere hook predefiniti separati per ogni azione Git.

git gancio

La rappresentazione pittorica di Git hook

Trovare ganci Git

Puoi trovare gli hook Git nella cartella del tuo progetto (a condizione che Git sia inizializzato) in .git/hooks . Lì troverai tutti gli hook con estensione .sample per impedirne l'esecuzione per impostazione predefinita.

Per utilizzare gli hook richiesti, è necessario rimuovere l'estensione .sample e modificare il codice per l'esecuzione.

Sono disponibili molti hook Git, ma utilizzeremo hook Git pre-commit per avviare gli standard di codifica Drupal.

Gli hook Git pre-commit sono hook che verranno eseguiti prima che venga eseguito il commit del codice. Controlla la riga di codice di cui viene eseguito il commit.

Implementazione degli hook Git

Prima di iniziare, assicurati di avere pronti questi requisiti di base:

  • Compositore
  • Idiota
  • Php-code-sniffer
  • drupal/codificatore:8.3.13

La procedura seguente è per l'installazione nei dispositivi Mac. Puoi trovare il link di riferimento qui per le istruzioni di installazione su altri dispositivi.

  • brew install php-code-sniffer
  • il compositore globale richiede drupal/coder:8.3.13
  • phpcs --config-set installed_paths ~/.composer/vendor/drupal/coder/coder_sniffer
  • phpc -i → Fornisce gli standard di codifica installati.

Cominciamo!

Sto creando un nuovo progetto Drupal chiamato demo . Puoi usarlo anche nel tuo progetto esistente.

demo del progetto drupal

→ Usando il comando cd siamo entrati nella cartella del progetto.
cd demo

→ inizializzare git nel progetto
Git init

→ Aggiunta e realizzazione del mio primo commit.
git commit -m "Commit iniziale"

Impegno iniziale

→ Installazione dello sniffer di codice php utilizzando il comando seguente per Mac.
brew install php-code-sniffer

aggiornato automaticamente

→ Installazione di Drupal coder utilizzando il compositore
il compositore globale richiede drupal/coder:8.3.13

→ Una volta definiti il ​​codificatore e il suo percorso, otterrai il seguente output come mostrato nell'immagine sottostante.
phpcs --config-set installed_paths ~/.composer/vendor/drupal/coder/coder_sniffer

→ phpc -i
Il comando sopra ti darà Drupal e DrupalPractice

annusare

→ Ora puoi eseguire il commit del tuo codice. Se riscontri errori di sintassi o di codifica standard, riceverai una notifica sul display e il processo di commit verrà interrotto.

codice commit

→ Di seguito è riportato il codice per correggere automaticamente l'errore

phpcbf --standard=Drupal --extensions=php,modulo,inc,installa,test,profilo,tema,css,info,txt,md,yml web/modules/custom/demo

Eventuali altri problemi dovranno essere risolti manualmente. Commit il tuo codice una volta fatto.

correggere il codice di errore

Una volta che il tuo codice è pulito, ti permetterà di impegnare il codice

codice di prova

Basta copiare e incollare il codice in pre-commit.sample all'interno di .git/hooks. Non dimenticare di rimuovere le estensioni di esempio.

Esempio di codice pre-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

Pensieri finali

Spero che tu abbia trovato questo articolo interessante e che ti aiuti a scrivere codice migliore perché un codice migliore significa un web migliore! Ti è piaciuto quello che hai appena letto? Prendi in considerazione l'iscrizione alla nostra newsletter settimanale e ricevi approfondimenti tecnici come questo nella tua casella di posta!