---
title: "รัน rubocop ก่อน commit"
description: "Git hooks มีประโยชน์มากสำหรับงานอัตโนมัติและการบังคับใช้มาตรฐานการเขียนโค้ดใน Git repository หนึ่งใน use case ที่พบบ่อยของ Git hooks คือการรัน test อัตโนมัติและเครื่องมือวิเคราะห์โค้ดก่อน..."
canonical: https://oozou.com/til/run-rubocop-before-commit-8
locale: th
date: 2020-10-13
topic: ruby
---

# รัน rubocop ก่อน commit

> Git hooks มีประโยชน์มากสำหรับงานอัตโนมัติและการบังคับใช้มาตรฐานการเขียนโค้ดใน Git repository หนึ่งใน use case ที่พบบ่อยของ Git hooks คือการรัน test อัตโนมัติและเครื่องมือวิเคราะห์โค้ดก่อน...

Published: 2020-10-13 · Topic: [ruby](https://oozou.com/th/til-topics/ruby) ([markdown](https://oozou.com/th/til-topics/ruby.md))

# บทนำ

Git hooks มีประโยชน์มากสำหรับงานอัตโนมัติและการบังคับใช้มาตรฐานการเขียนโค้ดใน Git repository หนึ่งใน use case ที่พบบ่อยของ Git hooks คือการรัน test อัตโนมัติและเครื่องมือวิเคราะห์โค้ดก่อนที่จะยอมให้ commit ผ่านได้ ในบทความนี้เราจะพูดถึง pre-commit hook วิธีข้ามมัน และวิธีตั้งค่า pre-commit hook เพื่อรัน Rubocop ซึ่งเป็นเครื่องมือวิเคราะห์โค้ด Ruby

# Rubocop คืออะไร?

Rubocop คือเครื่องมือ static code analysis สำหรับ Ruby ที่ตรวจสอบโค้ดทั้งเรื่อง style และปัญหาด้านความปลอดภัย เป็นเครื่องมือยอดนิยมในหมู่นักพัฒนา Ruby เพื่อให้แน่ใจว่าโค้ดเป็นไปตาม Ruby style guide และ best practice ต่าง ๆ จะรัน Rubocop เองก็ได้ แต่ถ้าผูกไว้กับ pre-commit hook โค้ดจะถูกตรวจให้อัตโนมัติก่อนทุก commit

คัดลอกโค้ดนี้ไปไว้ใน *.git/hooks/pre-commit* (ลบ .sample ออก)

```ruby
#!/usr/bin/env ruby

require 'english'
require 'rubocop'

ADDED_OR_MODIFIED = /A|AM|^M/.freeze

changed_files = `git status --porcelain`.split(/\n/).
    select { |file_name_with_status|
      file_name_with_status =~ ADDED_OR_MODIFIED
    }.
    map { |file_name_with_status|
      file_name_with_status.split(' ')[1]
    }.
    select { |file_name|
      File.extname(file_name) == '.rb'
    }.join(' ')

system("rubocop #{changed_files}") unless changed_files.empty?

exit $CHILD_STATUS.exitstatus
```

ทำให้ไฟล์รันได้

```
$ chmod +x .git/hooks/pre-commit
```

เท่านี้ก็พร้อมใช้งาน จากนี้ไปมันจะรัน rubocop กับโค้ดที่เปลี่ยน และจะไม่ยอมให้ commit จนกว่าคุณจะแก้ offence ที่พบ

จะข้าม pre-commit ได้อย่างไร? แค่ส่ง *-n* ให้ *git commit*

```
$ git commit -n -m "[hotfix] blah blah"
```

# Pre-Commit Hook คืออะไร?

pre-commit hook คือ Git hook ฝั่ง client ที่รันก่อนที่ commit จะถูกสร้าง มันคือ Script ที่ทำได้หลายอย่าง เช่น รัน test อัตโนมัติ ตรวจสอบ style ของโค้ด หรือบังคับใช้มาตรฐานการเขียนโค้ด ถ้า pre-commit hook ล้มเหลว commit นั้นจะถูกยกเลิก และคุณต้องแก้ปัญหาก่อนจะ commit ใหม่อีกครั้ง

# ทำไมต้องรัน Rubocop ก่อน Commit

**การรัน Rubocop ก่อน commit มีข้อดีหลายอย่าง:**

- คุณภาพโค้ด: Rubocop ตรวจสอบโค้ดทั้งเรื่อง style และปัญหาด้านความปลอดภัย ทำให้ codebase สม่ำเสมอและปลอดภัย
- ประหยัดเวลา: การรัน Rubocop โดยอัตโนมัติก่อน commit ช่วยให้จับปัญหาได้ตั้งแต่เนิ่น ๆ และไม่ต้องเสียเวลา debug ทีหลัง
- การทำงานร่วมกัน: การบังคับใช้มาตรฐานการเขียนโค้ดผ่าน pre-commit hook ช่วยส่งเสริมการทำงานร่วมกันและความสม่ำเสมอในทีม

**วิธีตั้งค่า pre-commit hook**

1. ติดตั้ง Rubocop และเครื่องมือ pre-commit hook ที่คุณเลือก (เช่น Husky หรือ Pre-commit)
2. สร้างไฟล์ใหม่ชื่อ pre-commit ใน Directory .git/hooks
3. เพิ่มคำสั่ง Rubocop ลงในไฟล์ pre-commit เช่น rubocop -a
4. ทำให้ไฟล์ pre-commit รันได้ด้วยการรัน chmod +x .git/hooks/pre-commit
5. ทดสอบ pre-commit hook ด้วยการรัน git commit -m “Test commit”

***หมายเหตุ: ถ้าต้องการข้าม pre-commit hook ชั่วคราว ให้ใช้ตัวเลือก --no-verify กับคำสั่ง git commit เช่น git commit -m “Test commit” --no-verify***

---

Contact OOZOU: hello@oozou.com · +66 2544 0000 · https://oozou.com/th/contact

More for AI agents: https://oozou.com/llms.txt · every page has a markdown twin at its URL plus ".md"
