1.5.3.1. 代码风格检查
我们在 Terraform 模块剖析中介绍了一系列有关 Terraform 代码的规范,以确保代码风格一致性和遵循最佳实践,但是依靠人工去确保模块代码,以及对模块的变更符合所有的规范显然是不现实的。
对于代码风格的问题,我们一般由两种工具进行处理:Linter 与 Autofix。
1.5.3.1.1. 什么是 Linter?
Linter 是一种静态代码分析工具,用于在不执行代码的情况下,检查代码中的潜在错误、风格问题和不符合最佳实践的地方。通过使用 Linter,开发团队可以:
- 提高代码质量:及时发现语法错误、潜在的逻辑问题和不一致的编码风格。
- 统一编码规范:确保团队成员遵循统一的编码标准,减少代码审查中的争议。
- 减少人为错误:自动化的检查减少了因人为疏忽导致的问题。
在 Terraform 生态中,常用的 Linter 工具是TFLint,它是专为 Terraform 设计的 Linter,支持多种云服务提供商的规则插件,能够检测语法错误、资源配置问题以及不符合最佳实践的用法。我们将在后续工具篇章中对它进行深入介绍。
1.5.3.1.2. 什么是 Autofix?
Autofix 是指工具在检测到代码问题后,能够自动进行修复的功能。相比仅提示问题的 Linter,支持 Autofix 的工具可以:
- 提高开发效率:自动修复常见问题,减少手动修改的时间。
- 确保风格一致性:统一的自动修复机制确保整个代码库的风格一致。
- 降低学习成本:新成员可以通过自动修复了解和适应团队的编码规范。
在 Terraform 中,支持 Autofix 的工具包括:
- terraform fmt:Terraform 自带的格式化工具,自动调整代码格式以符合官方风格指南 。
- TFLint:从 v0.47.0 版本开始,TFLint 引入了
--fix
参数,支持自动修复部分检测到的问题,如命名不规范、冗余代码等 。 avmfix
:我为 AVM 开发的代码自动化修复工具,可以用来自动修复部分问题,例如块被声明在错误的文件中、参数顺序错误等。
1.5.3.1.3. 为什么要区分 Linter 和 Autofix 工具?
虽然 Linter 和 Autofix 工具在功能上有交集,但它们的侧重点不同:
- Linter:主要用于检测问题,提供详细的错误信息和改进建议,帮助开发者理解问题的根源。
- Autofix:侧重于自动修复已知的问题,减少人工干预,提高开发效率。
受到 go fmt
的启发,在管理成百上千个模块代码仓库时,我们认为代码风格在内的许多选择不是仓库维护者可以定制化的,也不应该让仓库维护者消耗精力去思考和决定,所以我们应尽可能地提升自动修复工具覆盖的问题范围。人类维护者的精力应该放在更有价值的问题上,例如模块的设计,输入变量是否易于使用,模块是否在 Day 2 易于维护等等。
另外一个问题是:并不是所有问题都可以自动化修复的。对于我们知道有问题,但不知道该如何修复的代码,我们只能通过 Linter 阻止变更合并,并向变更作者指出问题的位置,由人类来决定该如何修复。