OOZOU
与我们联系
返回 TIL 列表
ruby

在 commit 之前运行 rubocop

October 13, 2020

前言

Git hooks 对于在 Git repository 中自动化任务、落实代码规范来说非常强大。Git hooks 的一个常见用途,就是在允许 commit 之前先运行自动化测试和代码分析工具。这篇文章会介绍 pre-commit hook、如何跳过它,以及如何设置一个 pre-commit hook 来运行 Rubocop 这个 Ruby 代码分析工具。

什么是 Rubocop?

Rubocop 是 Ruby 的静态代码分析工具,会检查代码的风格和安全性问题。它在 Ruby 开发者中相当受欢迎,用来确保代码遵循 Ruby style guide 和最佳实践。Rubocop 可以手动运行,但把它集成进 pre-commit hook,就能确保每次 commit 之前代码都会自动被检查。

把下面的内容复制到 .git/hooks/pre-commit(去掉 .sample)

#!/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,除非你修正这些 offence,否则就无法 commit。

要怎么跳过 pre-commit?只要在 git commit 加上 -n 就行

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

什么是 pre-commit hook?

pre-commit hook 是一种在创建 commit 之前运行的 client 端 Git hook。它是一段脚本,可以做各种事情,例如运行自动化测试、检查代码风格或落实代码规范。如果 pre-commit hook 失败,commit 就会被中止,你必须先修正问题才能再次 commit。

为什么要在 commit 之前运行 Rubocop

在 commit 之前运行 Rubocop 有几个好处:

  • 代码质量:Rubocop 会检查代码的风格和安全性问题,让整个 codebase 保持一致且安全。
  • 节省时间:在 commit 之前自动运行 Rubocop,可以及早发现问题,避免之后浪费时间调试。
  • 团队协作:通过 pre-commit hook 落实代码规范,能促进团队成员之间的协作与一致性。

如何设置 pre-commit hook

  1. 安装 Rubocop 和你选择的 pre-commit hook 工具(例如 Husky 或 Pre-commit)。
  2. 在 .git/hooks 目录中创建一个名为 pre-commit 的新文件。
  3. 把 Rubocop 命令加进 pre-commit 文件,例如 rubocop -a。
  4. 运行 chmod +x .git/hooks/pre-commit 把 pre-commit 文件设为可执行。
  5. 运行 git commit -m “Test commit” 来测试 pre-commit hook

注意:如果你想暂时跳过 pre-commit hook,可以在 git commit 命令加上 --no-verify 选项,例如 git commit -m “Test commit” --no-verify。

更多关于 ruby 的笔记

rubyApril 30, 2021

让 Pry 支持粘贴使用行首点记法的多行 Ruby 区块

我们现在很常使用行首点记法,例如

rubyOctober 14, 2020

不含插值的 Heredoc

有时你想用 Ruby 的 Heredoc,但不希望它做插值('#{....}')。只要给你的标识符加上一对单引号就能做到:

rubyOctober 13, 2020

在 Ruby 中自动创建中间层的 Hashtable

所有中间层的 hashtable 都会魔法般地自动创建出来

有项目想法吗?

我们很想听听您正在做的产品。

开始对话hello@oozou.com
OOZOU Logo

曼谷 · 新加坡 · 香港

X
Facebook
Instagram
LinkedIn
OOZOU Co., Ltd.
548 One City Centre
Ploenchit Road
Bangkok 10330
Thailand
+66 2544 0000
hello@oozou.com

服务

  • Web 开发
  • AI 智能体与生成式 AI
  • 移动应用开发
  • 数据分析与工程
  • UI/UX 与产品设计
  • 数字化转型

公司

  • 关于我们
  • 加入我们
  • 博客
  • 案例研究
  • Today I Learned
  • 联系我们

更多

  • 行业
  • 合作伙伴网络
© 2026 OOZOU. 版权所有。
隐私政策行为准则反贿赂反贪腐政策