UDN-企业互联网技术人气社区

板块导航

浏览  : 530
回复  : 0

[干货] 在 iOS 开发中使用 pre-commit hook

[复制链接]
呵呵燕的头像 楼主

j.png


  许多人写了单元测试并且运行持续集成服务器来检查 pull requests,我们还可以利用像 Danger 这样强大的工具。

  如果想要在最早期阻止一些常见的错误,我们可以使用 pre-commit hook。

  注:原作者的朋友 Sami Samhuri 改善了他的脚本,本文也随着更新了。另外译文调整了一下结构,增加了对 pre-commit 的简要说明。最新的脚本在这里。

  pre-commit hook

  有时候一些测试代码或者测试工具不应该提交到远程仓库,所以提交代码前的审查就很有必要。Git 支持很多 hooks,hooks 是一些在

  
  1. $GIT-DIR/hooks
复制代码

  目录中的脚本,由特定的事件触发执行。pre-commit hook 就是在提交之前触发,可以用来检查待提交代码是否有错误。这里可以查看到有关 git hooks 更详细的说明。

  我们想要阻止的

  放错位置的视图 (Misplaced Views)

  你有提交过一些位置不对的视图,打算以后修复吗?

  有时候 Xcode 过于热切,并且有多个显示器(视网膜vs非视网膜问题…),就很容易突然把东西放错位置。

  我就做过。

  用一个简单的 grep 扫描 interface builder 文件内容可以发现这些错位的视图:

  模式:misplaced=”YES”

  文件:*Specs.swift *.storyboard

  集中测试 (Focused tests)

  像 Kiwi 或者 Quick 这样的代码库可以让我们做集中测试,这可以加快开发速度,很有用。

  但是它们绝对不应该被提交,否则可能无意中改变一些东西,造成其他所有测试都被禁用,还会隐藏一些严重的问题。

  我们需要在测试文件中找出 fdescribe / fit / fcontext 和其他类似的东西:

  模式:

 
  1.  (fdescribe|fit|fcontext|xdescribe|xit|xcontext)
复制代码


  文件:

  
  1. *Specs.swift
复制代码


  合并起来

  我们只需要确认已暂存(staged)的改变中是否包含上面的东西就好了,不要检查所有文件,因为这在开发的时候会很烦人。

  幸运的是,我们可以把

 
  1.  git diff-index -p -M --cached HEAD
复制代码

  和

 
  1.  grep '^+'
复制代码


  一起使用。

  最终的 pre-commit.sh 文件:

  
  1. #!/usr/bin/env bash

  2.   set -eu

  3.   failed=0

  4.   test_pattern='\b(fdescribe|fit|fcontext|xdescribe|xit|xcontext)\b'

  5.   if git diff-index -p -M --cached HEAD -- '*Tests.swift' '*Specs.swift' | grep '^+' | egrep "$test_pattern" >/dev/null 2>&1

  6.   then

  7.   echo "COMMIT REJECTED for fdescribe/fit/fcontext/xdescribe/xit/xcontext." >&2

  8.   echo "Remove focused and disabled tests before committing." >&2

  9.   echo '----' >&2

  10.   git grep -E "$test_pattern" '*Tests.swift' '*Specs.swift' >&2

  11.   echo '----' >&2

  12.   failed=1

  13.   fi

  14.   misplaced_pattern='misplaced="YES"'

  15.   if git diff-index -p -M --cached HEAD -- '*.xib' '*.storyboard' | grep '^+' | egrep "$misplaced_pattern" >/dev/null 2>&1

  16.   then

  17.   echo "COMMIT REJECTED for misplaced views. Correct them before committing." >&2

  18.   echo '----' >&2

  19.   git grep -E "$misplaced_pattern" '*.xib' '*.storyboard' >&2

  20.   echo '----' >&2

  21.   failed=1

  22.   fi

  23.   exit $failed
复制代码


  你也可以在这里获取最新的脚本。这个脚本在命令行和 macOS git 客户端都可以使用。

  让 hook 在团队中保持同步

  大多数的应用都是由团队制作的,我们就想到要在每个 git 仓库中安装钩子 (git hook)。但这并不是使用 git 的工作方式,那我们该怎么做呢?答案:使用符号链接(symlinks)。

  我负责过的大多数项目都有类似于 bootstrap script 的东西,用来加载 Carthage 或者做其他一些准备工作。

  下面这个简单的启动脚本 (bootstrap script) 可以让你在你的仓库里安装钩子 (git hook),使得整个团队保持同步变得简单。

 
  1. #!/usr/bin/env bash

  2.   # Usage: scripts/bootstrap

  3.   set -eu

  4.   ln -s ../../scripts/pre-commit.sh .git/hooks/pre-commit
复制代码


  如果有错误,它将退出shell,如果未设置任何变量,则将错误消息写入标准错误。

  创建 git 内部预提交钩子文件(internal git pre-commit hook file)与我们的仓库中脚本之间的符号链接。

  这个脚本假设 pre-commit.sh 和 bootstrap 文件都在你的仓库的 Scripts 文件夹下面。

  总结

  预提交钩子给我们提供了很简单的方式去阻止一些常见的错误,

  一行代码就可以为团队中所有人配置

  在整个团队中同步

  git 跟踪变化,PR 中可见

  用脚本实现,如果你愿意,你可以把它作为 build phase 执行(尽管我没有)

原文作者:佚名  来源:开发者头条

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部