Git フックを使用して Drupal コーディング標準に準拠する方法

公開: 2023-05-23

優れたコードは、よく構築されたレゴ作品のようなものです。強度があり、見栄えがよく、必要に応じて簡単に変更できます。 優れたコーディング標準の重要性は、チームでコーディングしている場合、スケーラブルなプロジェクトに取り組んでいる場合、または Drupal のようなオープンソース コミュニティに参加している場合に特に高くなります。

他のオープンソース プロジェクトと同様、Drupal には何千人もの開発者がプロ​​ジェクトに取り組んでいます。 そして、それぞれが独自のレベルの専門知識を持っています。 チームやコミュニティの全員が適切なコーディング慣行に従っていることを確認するにはどうすればよいでしょうか? Git フック!

Git フックは、コードが常に Drupal のコーディング標準を満たしていることを確認するための簡単で自動化された方法です。 Git フックを使用して Drupal コーディング標準を実装すると、開発者は Drupal コミュニティによって宣言されている適切なコーディング標準を使用してコードをコミットしてプッシュすることができます。 また、プロジェクト管理スキルの向上にも役立ち、開発者が適切なコミット メッセージ標準に従ってコードをコミットできるようになります。 Git フックとそれを実行する方法について詳しく学習してください。

gitフック

Gitフックとは何ですか

Git フックは、Git コマンドが呼び出されるたびに自動的に実行されるスクリプトです。 Drupal のフォームを変更するためにhook_form_alter を使用するのと同じように、Git アクションごとに個別の事前定義フックを使用できます。

gitフック

Git フックの図による表現

Git フックを見つける

Git フックは、プロジェクト フォルダー内の.git/hooksの下にあります (Git が初期化されている場合)。 ここには、デフォルトで実行されないようにするための.sample拡張子が付いたすべてのフックが表示されます。

必要なフックを使用するには、 .sample拡張子を削除し、実行用のコードを編集する必要があります。

利用可能な Git フックは多数ありますが、Drupal コーディング標準を開始するには、事前コミットGit フックを使用します。

コミット前Git フックは、コードがコミットされる前に実行されるフックです。 コミットされているコード行をチェックします。

Gitフックの実装

始める前に、次の基本的な要件を準備していることを確認してください。

  • 作曲
  • ギット
  • PHPコードスニファー
  • Drupal/コーダー:8.3.13

以下の手順は、Mac デバイスにインストールする場合です。 他のデバイスへのインストール手順については、ここに参照リンクがあります。

  • brew install php-code-sniffer
  • コンポーザー グローバルには drupal/coder が必要です:8.3.13
  • phpcs --config-setinstalled_pa​​ths ~/.composer/vendor/drupal/coder/coder_sniffer
  • phpcs -i → インストールされているコーディング標準が表示されます。

さぁ、始めよう!

私は、 demoという名前の新しい Drupal プロジェクトを作成しています。 既存のプロジェクトでも使用できます。

Drupal プロジェクトのデモ

→ cd コマンドを使用してプロジェクトフォルダーに移動します。
CDデモ

→ プロジェクトへの Git の初期化
Gitの初期化

→ 最初のコミットを追加して作成します。
git commit -m “初期コミット”

初期コミット

→ Mac の場合は以下のコマンドを使用して PHP コード スニファーをインストールします。
brew install php-code-sniffer

自動更新

→ Composer を使用して Drupal Coder をインストールする
コンポーザー グローバルには drupal/coder が必要です:8.3.13

→ コーダーとそのパスが定義されると、下の画像に示すような出力が得られます。
phpcs --config-setinstalled_pa​​ths ~/.composer/vendor/drupal/coder/coder_sniffer

→ phpcs -i
上記のコマンドにより、Drupal と DrupalPractice が提供されます。

スニッファー

→ これでコードをコミットできるようになります。 構文エラーまたはコーディング標準エラーがある場合は、画面に通知され、コミット プロセスが中止されます。

コードをコミットする

→ 以下はエラーを自動的に修正するコードです

phpcbf --standard=Drupal --extensions=php、module、inc、インストール、テスト、プロファイル、テーマ、css、info、txt、md、yml web/modules/custom/demo

その他の問題は手動で修正する必要があります。 完了したらコードをコミットします。

エラーコードを修正する

コードがクリーンになると、コードをコミットできるようになります

テストコード

コードをコピーして、.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

最終的な考え

より良いコードはより良い Web を意味するため、この記事が興味深く、より良いコードを書くのに役立つことを願っています。 今読んだ内容は気に入りましたか? 毎週のニュースレターの購読を検討して、このような技術的な洞察を受信箱に届けてください。