Review coding conventions với pre-commit

LAMP Jun 20, 2021

Hello mọi người!!!
Bài viết hôm này mình xin viết về một chủ đề nóng như mùa hè Hà Nội vậy. Như mọi người đã biết bắt đầu từ tháng này, line sẽ triển khai coding conventions vào các dự án của công ty.


nguồn: google search

1. Coding conventions là gì?


Vì được sếppp và mọi người nói nhiều về phần này rồi nên mình xin phép nói thêm 2 ý chính sau:

  • Coding conventions là thuật ngữ mà có lẽ bất kì một lập trình nào cũng từng nghe nói tới. Trên thực tế, việc tuân thủ theo coding conventions hay không hầu như không ảnh hưởng đến kết quả của công việc. Hàm vẫn chạy, code vẫn thực thi tốt và sản phẩm chẳng có gì khác biệt.
  • Tuy nhiên đối với các hệ thống được thiết kế và bảo trì qua nhiều giai đoạn, với nguồn nhân lực khác nhau, thì việc tuân theo một coding conventions thực sự là một vấn đề sống còn. Người đọc code sẽ chắc hẳn sẽ hạnh phúc và tiết kiểm thời gian hơn rất nhiều, khi đọc đoạn code với các biến được đặt tên rõ ràng như userName, role,... thay vì a,b,c.

2. Tại sao phải áp dụng coding conventions?


Mỗi dự án phần mềm thường được phát triển bởi một team thay vì một cá nhân, việc thống nhất coding conventions giữa các thành viên là một việc quan trọng nhằm tăng chất lượng code và giúp code thống nhất theo một chuẩn giúp thuận tiện trong việc đọc cũng như cải tiến thay đổi trong tương lai. Chắc hẳn là lập trình viên thường rất khó chịu khi phải đọc code do người khác viết mà không theo một quy chuẩn thống nhất nào . Chính vì lý do đó mỗi ngôn ngữ lập trình thường có những bộ linter giúp kiểm tra, thiết lập coding conventions. Lập trình viên thường sử dụng những bộ công cụ linter này để kiểm tra cũng như tuân thủ theo coding conventions đã được đề ra. Tuy nhiên làm sao có thể đảm bảo lập trình viên đã kiểm tra lại code của mình một cách kĩ càng trước khi đoạn code đó được tích hợp, liệu có khả năng xảy ra việc quên hay nhầm lẫn. Vậy phương pháp giải quyết ở đây là gì?


3. Phương pháp giải quyết.


Nói đến phương pháp giải quyết thì rất nhiều nhưng hôm nay mình xin giới thiệu một phương pháp giúp giải quyết vấn đề tương đối đơn giản đó là sử dụng pre-commit check. Trong bài viết này chúng ta cùng tìm hiểu về pre-commit check và cách thiết lập nó trong một dự án.


4. Pre-commit check là gì?


Pre-commit check là quá trình kiểm tra những đoạn code thay đổi để sẵn sàng cho việc tạo một commit mới. Nếu quá trình này thành công một commit mới sẽ được tạo ra, ngược lại nếu pre-commit check thất bại commit sẽ không được tạo và hiển thị thông báo lỗi cho lập trình viên. Pre-commit check thường được sử dụng cho việc kiểm tra coding styles, coding conventions một cách tự động trước khi các thay đổi code được tích hợp.
Nói hơi nhiều về lý thuyết rồi nên mình xin phép vào thẳng vấn đề của bài viết hôm nay luôn nhé. Đó là cài đặt pre-commit.


5. Cài đặt pre-commit.


5.1. Tải PHP Code Sniffer.

 curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcs.phar
 curl -OL https://squizlabs.github.io/PHP_CodeSniffer/phpcbf.phar

5.2. Kiểm tra PHP Code Sniffer.

 php phpcs.phar -h
 php phpcbf.phar -h

5.3. Cài đặt PHP_CodeSniffer.

composer require --dev squizlabs/php_codesniffer

5.4. Tạo thư mục git-hooks và tệp pre-commit trong thư mục gốc của dự án.

- Tạo thư mục Hooks
    mkdir git-hooks 
- Tạo tệp pre-commit
    touch pre-commit
- Chỉnh sửa tệp pre-commit
#!/bin/sh

PROJECT=`php -r "echo dirname(dirname(dirname(realpath('$0'))));"`
STAGED_FILES_CMD=`git diff --cached --name-only --diff-filter=ACMR HEAD | grep \\\\.php`

# Determine if a file list is passed
if [ "$#" -eq 1 ]
then
oIFS=$IFS
IFS='
'
SFILES="$1"
IFS=$oIFS
fi
SFILES=${SFILES:-$STAGED_FILES_CMD}

echo "Checking PHP Lint..."
for FILE in $SFILES
do
php -l -d display_errors=0 $PROJECT/$FILE
if [ $? != 0 ]
then
   echo "Fix the error before commit."
   exit 1
fi
FILES="$FILES $PROJECT/$FILE"
done

if [ "$FILES" != "" ]
then
echo "Running Code Sniffer. Code standard PSR12."
./vendor/bin/phpcs --standard=PSR12 --colors --encoding=utf-8 -n -p $FILES
if [ $? != 0 ]
then
   echo "Fix the error before commit!"
   echo "Run"
   echo "  ./vendor/bin/phpcbf --standard=PSR12 $FILES"
   echo "for automatic fix or fix it manually."
   exit 1
fi
fi

exit $?

5.5. Di chuyển pre-commit đến hooks git và phân quyền.

cp git-hooks/pre-commit .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit

5.6. Kết quả.

Đang faild psr-12 

Git commit các tệp thay đổi thì pre-commit tự động kiểm tra coding conventions. nếu các tệp pass qua hết các coding conventions thì commit thành công. Ngược lại thì thông báo lỗi, dòng bị lỗi và bắt chúng ta sửa đúng theo coding conventions thì mới cho commit.

5.7. Mở rộng.

  • Viết thêm các coding conventions mà mình muốn vào tệp phpcs.xml.
    <?xml version="1.0"?>
    <ruleset name="PSR2">   
    <description>The PSR2 coding standard.</description>   
    <rule ref="PSR2"/>    
    <file>app/</file>    
    <exclude-pattern>vendor</exclude-pattern>   
    <exclude-pattern>resources</exclude-pattern>   
    <exclude-pattern>database/</exclude-pattern>   
    <exclude-pattern>storage/</exclude-pattern>   
    <exclude-pattern>node_modules/</exclude-pattern>
    </ruleset>

6. Lời kết.

Bài viết giới thiệu sơ bộ về cách thiết lập pre-commit. Còn rất nhiều thứ mà bạn có thể tự thiết lập cho phù hợp với dự án của bản thân, các bạn có thể tìm hiều và tạo ra một số thứ hay ho với chúng. Tuy còn sơ sài, nhưng hy vọng bài viết sẽ có ích với mọi người.
Cảm ơn mọi người đã đọc bài viết này. Bài viết này có gì sai sót thì mình khắc phục ở bài viết lần sau. Xin hứa bài sau sẽ hay hơn bài này.

Tags

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.