Как придерживаться стандартов кодирования Drupal с помощью Git Hooks

Опубликовано: 2023-05-23

Хороший код подобен хорошо построенным конструкторам Lego — он надежный, хорошо выглядит и его легко изменить при необходимости. Важность хороших стандартов кодирования особенно высока, когда вы программируете в команде, работаете над масштабируемым проектом или участвуете в сообществе с открытым исходным кодом, таком как Drupal.

Как и в любом другом проекте с открытым исходным кодом, над Drupal работают тысячи разработчиков. И каждый из них приходит со своим уровнем знаний. Как вы гарантируете, что все в вашей команде или в сообществе следуют передовым методам написания кода? Гит Хуки!

Git Hooks — это простой автоматизированный способ убедиться, что ваш код всегда соответствует стандартам кодирования Drupal. Внедрение стандартов кодирования Drupal с помощью Git hook поможет разработчикам фиксировать и продвигать код в соответствии с надлежащими стандартами кодирования, заявленными сообществом Drupal. Это также может помочь улучшить ваши навыки управления проектами и позволяет разработчикам фиксировать код с надлежащими стандартами сообщений фиксации. Узнайте больше о хуках Git и о том, как их применять.

git-хуки

Что такое Git Hook

Git Hooks — это скрипты, которые запускаются автоматически каждый раз, когда вызывается команда Git. Точно так же, как вы использовали бы hook_form_alter для изменения форм в Drupal, вы можете иметь отдельные предопределенные хуки для каждого действия Git.

git хук

Графическое представление хука Git

Поиск хуков Git

Вы можете найти хуки Git в папке вашего проекта (при условии, что Git инициализирован) в .git/hooks . Там вы найдете все хуки с расширением .sample , чтобы предотвратить их выполнение по умолчанию.

Чтобы использовать необходимые хуки, вам нужно удалить расширение .sample и отредактировать свой код для выполнения.

Доступно много хуков Git, но мы собираемся использовать хуки Git перед фиксацией для запуска стандартов кодирования Drupal.

Перехватчики Git перед фиксацией — это перехватчики, которые будут запущены до того, как код будет зафиксирован. Он проверяет строку кода, которая фиксируется.

Реализация хуков Git

Прежде чем начать, убедитесь, что у вас готовы следующие основные требования:

  • Композитор
  • Гит
  • Сниффер PHP-кода
  • друпал/кодер: 8.3.13

Ниже описана процедура установки на устройства Mac. Здесь вы можете найти справочную ссылку для инструкций по установке на другие устройства.

  • варить установить сниффер php-кода
  • глобальный композитор требует drupal/coder:8.3.13
  • phpcs --config-set установленные_пути ~/.composer/vendor/drupal/coder/coder_sniffer
  • phpcs -i → даст вам установленные стандарты кодирования.

Давай начнем!

Я создаю новый проект Drupal под названием demo . Вы также можете использовать его в своем существующем проекте.

демо проекта друпал

→ С помощью команды cd мы попали в папку проекта.
компакт-диск демо

→ инициализация git в проекте
Git инициировать

→ Добавляю и делаю свой первый коммит.
git commit -m «Начальный коммит»

Первоначальная фиксация

→ Установка сниффера кода php с помощью приведенной ниже команды для Mac.
варить установить сниффер php-кода

автоматическое обновление

→ Установка Drupal coder с помощью composer
глобальный композитор требует drupal/coder:8.3.13

→ Как только кодер и его путь будут определены, вы получите следующий вывод, как показано на рисунке ниже.
phpcs --config-set установленные_пути ~/.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

Последние мысли

Я надеюсь, что эта статья показалась вам интересной и помогла вам писать лучший код, потому что лучший код означает лучшую сеть! Понравилось то, что вы только что прочитали? Рассмотрите возможность подписки на наш еженедельный информационный бюллетень и получайте техническую информацию, подобную этой, на ваш почтовый ящик!