Git Hooks로 Drupal 코딩 표준을 준수하는 방법

게시 됨: 2023-05-23

좋은 코드는 잘 만들어진 레고 제품과 같습니다. 강력하고 보기 좋으며 필요한 경우 쉽게 변경할 수 있습니다. 우수한 코딩 표준의 중요성은 팀에서 코딩하거나 확장 가능한 프로젝트에 참여하거나 Drupal과 같은 오픈 소스 커뮤니티에 참여할 때 특히 중요합니다.

다른 오픈 소스 프로젝트와 마찬가지로 Drupal에는 프로젝트에 참여하는 수천 명의 개발자가 있습니다. 그리고 그들 각각은 자신의 전문 지식 수준을 가지고 있습니다. 팀 또는 커뮤니티의 모든 사람이 좋은 코딩 관행을 따르도록 어떻게 보장합니까? 힘내 후크!

Git Hooks는 코드가 항상 Drupal의 코딩 표준을 충족하도록 하는 쉽고 자동화된 방법입니다. Git 후크로 Drupal 코딩 표준을 구현하면 개발자가 Drupal 커뮤니티에서 선언한 적절한 코딩 표준으로 코드를 커밋하고 푸시하는 데 도움이 됩니다. 또한 프로젝트 관리 기술을 향상시키는 데 도움이 될 수 있으며 개발자가 적절한 커밋 메시지 표준으로 코드를 커밋할 수 있습니다. Git 후크와 이를 실행하는 방법에 대해 자세히 알아보세요.

자식 후크

힘내 후크는 무엇입니까

Git Hooks는 Git 명령이 호출될 때마다 자동으로 실행되는 스크립트입니다. hook_form_alter를 사용하여 Drupal에서 양식을 변경하는 것처럼 모든 Git 작업에 대해 별도의 미리 정의된 후크를 가질 수 있습니다.

자식 후크

Git hook의 그림 표현

Git 후크 찾기

.git/hooks 아래의 프로젝트 폴더(Git가 초기화된 경우) 내에서 Git 후크를 찾을 수 있습니다. 거기에서 기본적으로 실행되지 않도록 .sample 확장자를 가진 모든 후크를 찾을 수 있습니다.

필요한 후크를 사용하려면 .sample 확장자를 제거하고 실행을 위해 코드를 편집해야 합니다.

사용할 수 있는 많은 Git 후크가 있지만 Drupal 코딩 표준을 시작하기 위해 사전 커밋 Git 후크를 사용할 것입니다.

사전 커밋 Git 후크는 코드가 커밋되기 전에 실행되는 후크입니다. 커밋되는 코드 줄을 확인합니다.

Git Hook 구현

시작하기 전에 다음과 같은 기본 요구 사항이 준비되어 있는지 확인하십시오.

  • 작곡가
  • 힘내
  • PHP 코드 스니퍼
  • 드루팔/코더:8.3.13

아래 절차는 Mac 장치에 설치하는 경우입니다. 다른 장치에 대한 설치 지침에 대한 참조 링크는 여기에서 찾을 수 있습니다.

  • 양조 설치 PHP 코드 스니퍼
  • 작곡가 글로벌 요구 사항 drupal/coder:8.3.13
  • phppcs --config-set installed_paths ~/.composer/vendor/drupal/coder/coder_sniffer
  • phpcs -i → 설치된 코딩 표준을 제공합니다.

의 시작하자!

demo 라는 새로운 Drupal 프로젝트를 만들고 있습니다. 기존 프로젝트에서도 사용할 수 있습니다.

드루팔 프로젝트 데모

→ cd 명령을 사용하여 프로젝트 폴더로 이동했습니다.
CD 데모

→ 프로젝트에 git 초기화
힘내 초기화

→ 첫 번째 커밋을 추가하고 만듭니다.
git commit -m "초기 커밋"

초기 커밋

→ Mac의 경우 아래 명령을 사용하여 php code sniffer를 설치합니다.
양조 설치 PHP 코드 스니퍼

자동 업데이트

→ Composer를 이용한 Drupal 코더 설치
작곡가 글로벌 요구 사항 drupal/coder:8.3.13

→ 코더와 해당 경로가 정의되면 아래 이미지와 같이 다음과 같은 출력이 표시됩니다.
phppcs --config-set installed_paths ~/.composer/vendor/drupal/coder/coder_sniffer

→ PHPC -i
위의 명령은 Drupal 및 DrupalPractice를 제공합니다.

손수건

→ 이제 코드를 커밋할 수 있습니다. 구문 또는 코딩 표준 오류가 있는 경우 디스플레이에 알림이 표시되고 커밋 프로세스가 중단됩니다.

커밋 코드

→ 아래는 자동으로 오류를 수정하는 코드입니다.

phpcbf --standard=Drupal --extensions=php,module,inc,install,test,profile,theme,css,info,txt,md,yml 웹/모듈/커스텀/데모

다른 문제는 수동으로 수정해야 합니다. 완료되면 코드를 커밋합니다.

오류 코드 수정

코드가 깨끗해지면 코드를 커밋할 수 있습니다.

테스트 코드

.git/hooks 내의 pre-commit.sample에 코드를 복사하여 붙여넣기만 하면 됩니다. 샘플 확장을 제거하는 것을 잊지 마십시오.

커밋 전 코드 샘플:

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

마지막 생각들

더 나은 코드는 더 나은 웹을 의미하므로 이 기사가 흥미롭고 더 나은 코드를 작성하는 데 도움이 되었기를 바랍니다. 방금 읽은 내용이 마음에 드십니까? 주간 뉴스레터 구독을 고려하고 받은 편지함으로 전달되는 이와 같은 기술 통찰력을 얻으십시오!