使用SwiftLint作为Git预推钩

SwiftLint是由Realm的优秀人员开发的开源工具,可帮助维护Swift代码标准并强制用户适应最佳的编码规则和实践。 使用SwiftLint,您可以编写自己的代码规则并强制团队遵循它们。

SwiftLint不仅可用于CocoaPods,还可以使用命令行工具AppCode,Atom甚至Fastlane进行应用。 它甚至支持多个swift版本,并直接挂钩到SourceKit,因此随着swift的发展,它将继续有效。

就像其他版本控制系统一样,Git还提供了一种为过程中的某些特定事件触发一些自定义脚本的方法。 这些事件主要分为两个池,客户端和服务器端。

客户端挂钩由与提交,推送和合并相关的动作触发,这些动作可以进一步处理事前和之后的事件,而服务器挂钩与与网络相关的事件(如接收提交等)更相关-服务器端可以利用与提交,合并和推送相关的事件钩。

挂钩确实非常强大,因为我们知道开发人员在将有价值的代码推送到服务器之前必须确保很多事情,因此挂钩可以帮助您定义一些脚本,这些脚本可以防止您推送错误的未格式化代码甚至运行测试用例。

挂钩可以通过多种方式安装:

  1. 进行符号链接时,可以使用存储库本身来推动它们。
  2. 它们可以放在仓库的git文件夹中。
  3. 可以将它们安装为在所有存储库上全局工作。 (2.9以上版本)

我们将在本文中介绍第三种方法。

1.更新Git(如果尚未更新)

Xcode确实在您的机器上安装了Git,但是如果您仍然想检查和更新git版本,也可以按照以下步骤进行:

  • 打开终端并检查您的git版本(已更新)
  $ git --versiongit版本2.15.1(Apple Git-101) 
  • 备份Apple Git
  $ sudo mv / usr / bin / git / usr / bin / git-apple 
  • 如果尚未安装Homebrew
  $ / usr / bin / ruby​​ -e“ $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” 
  • 更新酿造
  $ brew更新&& brew升级 
  • 最后安装Git并进行符号链接,并确保检查其版本
  $ brew install git 
..
...
$ brew连接--force git
$ git-版本

2.复制钩子

  • 新建一个名为“ git-hooks”的文件夹(可以做任何事情,但请确保在以下步骤中更新命令)
  • 将下面的脚本复制到名称为’ pre-push ‘的文件夹中,该脚本应与此完全相同。
  #函数添加文件到Lint 
函数addFilesToLint {
filename =“”
数量= $ 2
对于$ 1中的项目

如果[[$ item == *“。swift” *]]; 然后
filename + =“ $ item”
导出SCRIPT_INPUT_FILE_ $ count =“ $ filename”
count = $((count + 1))
filename =“”
其他
filename + =“ $ item”
科幻
完成
}#查找SwiftLint
LINT = $(swiftlint)if [[--e“ $ {LINT}”]]; 然后
回显“ SwiftLint开始...”
其他
回显“ SwiftLint不存在,请从https://github.com/realm/SwiftLint下载”
1号出口
ficount = 0#获取正在提交但尚未推送的文件
target = $(git diff --stat --cached --name-only $(git for-each-ref --format ='%(upstream:short)'$(git symbolic-ref -q HEAD))| grep -F“ .swift”)
addFilesToLint“ $ {targets [0]}” $ countexport -p | grep SCRIPT_INPUT_FILEexport SCRIPT_INPUT_FILE_COUNT = $ countRESULT = $($ LINT lint --quiet --use-script-input-files)if [“ $ RESULT” ==“]; 然后
printf“ \ e [32mSwiftLint已完成。\ e [39m \ n”
其他
回声“”
printf“ \ e [41mSwiftLint失败。\ e [49m请检查以下内容:\ n”,同时读-r行; doFILEPATH = $(echo $ line | cut -d:-f 1)
L = $(echo $ line | cut -d:-f 2)
C = $(echo $ line | cut -d:-f 3)
TYPE = $(echo $ line | cut -d:-f 4 | cut -c 2-)
MESSAGE = $(echo $ line | cut -d:-f 5 | cut -c 2-)
Description = $(echo $ line | cut -d:-f 6 | cut -c 2-)
如果[“ $ TYPE” =='错误']; 然后
printf“ \ n \ e [31m $ TYPE \ e [39m \ n”
其他
printf“ \ n \ e [33m $ TYPE \ e [39m \ n”
科幻
printf“ \ e [90m $ FILEPATH:$ L:$ C \ e [39m \ n”
printf“ $ MESSAGE-$ DESCRIPTION \ n”
完成<<<“ $ RESULT” printf“ \ PUSH ABORTED。请在推送代码前对其进行修复。\ n”退出1
科幻
  • 确保脚本的名称正确无扩展名,并且有权执行。
  $ chmod + x预推 

3.设置全局挂钩

为了全局设置所有仓库的钩子,我们将钩子文件夹的路径添加到git全局配置中。

  $ git config --global core.hooksPath〜/ git-hooks 

4.安装SwiftLint

考虑到您已经安装了brew,请运行以下命令以将SwiftLint安装为命令行工具

  $ brew install swiftlint 

SwiftLint与开发人员工具紧密合作,因此请确保在Applications文件夹中安装了Xcode并选择了正确的Xcode。

  $ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer 

除此之外,如果您使用的是SourceTree,则当应用正常运行时,在运行githooks时会遇到一个尴尬的问题,因此请尝试使用open命令运行它。

  $打开/Applications/SourceTree.app/Contents/MacOS/SourceTree